PR binutils/15157
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998-2013 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23 \f
24 /* The difference between readelf and objdump:
25
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
28
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #ifdef HAVE_ZLIB_H
47 #include <zlib.h>
48 #endif
49 #ifdef HAVE_WCHAR_H
50 #include <wchar.h>
51 #endif
52
53 #if __GNUC__ >= 2
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55 as this will allow us to read in and parse 64bit and 32bit ELF files.
56 Only do this if we believe that the compiler can support a 64 bit
57 data type. For now we only rely on GCC being able to do this. */
58 #define BFD64
59 #endif
60
61 #include "bfd.h"
62 #include "bucomm.h"
63 #include "elfcomm.h"
64 #include "dwarf.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
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. */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h. */
80
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
87
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() */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/or32.h"
135 #include "elf/pj.h"
136 #include "elf/ppc.h"
137 #include "elf/ppc64.h"
138 #include "elf/rl78.h"
139 #include "elf/rx.h"
140 #include "elf/s390.h"
141 #include "elf/score.h"
142 #include "elf/sh.h"
143 #include "elf/sparc.h"
144 #include "elf/spu.h"
145 #include "elf/tic6x.h"
146 #include "elf/tilegx.h"
147 #include "elf/tilepro.h"
148 #include "elf/v850.h"
149 #include "elf/vax.h"
150 #include "elf/x86-64.h"
151 #include "elf/xc16x.h"
152 #include "elf/xgate.h"
153 #include "elf/xstormy16.h"
154 #include "elf/xtensa.h"
155
156 #include "elf/nios2.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 char * program_name = "readelf";
168 static long archive_file_offset;
169 static unsigned long archive_file_size;
170 static unsigned long dynamic_addr;
171 static bfd_size_type dynamic_size;
172 static unsigned int dynamic_nent;
173 static char * dynamic_strings;
174 static unsigned long dynamic_strings_length;
175 static char * string_table;
176 static unsigned long string_table_length;
177 static unsigned long num_dynamic_syms;
178 static Elf_Internal_Sym * dynamic_symbols;
179 static Elf_Internal_Syminfo * dynamic_syminfo;
180 static unsigned long dynamic_syminfo_offset;
181 static unsigned int dynamic_syminfo_nent;
182 static char program_interpreter[PATH_MAX];
183 static bfd_vma dynamic_info[DT_ENCODING];
184 static bfd_vma dynamic_info_DT_GNU_HASH;
185 static bfd_vma version_info[16];
186 static Elf_Internal_Ehdr elf_header;
187 static Elf_Internal_Shdr * section_headers;
188 static Elf_Internal_Phdr * program_headers;
189 static Elf_Internal_Dyn * dynamic_section;
190 static Elf_Internal_Shdr * symtab_shndx_hdr;
191 static int show_name;
192 static int do_dynamic;
193 static int do_syms;
194 static int do_dyn_syms;
195 static int do_reloc;
196 static int do_sections;
197 static int do_section_groups;
198 static int do_section_details;
199 static int do_segments;
200 static int do_unwind;
201 static int do_using_dynamic;
202 static int do_header;
203 static int do_dump;
204 static int do_version;
205 static int do_histogram;
206 static int do_debugging;
207 static int do_arch;
208 static int do_notes;
209 static int do_archive_index;
210 static int is_32bit_elf;
211
212 struct group_list
213 {
214 struct group_list * next;
215 unsigned int section_index;
216 };
217
218 struct group
219 {
220 struct group_list * root;
221 unsigned int group_index;
222 };
223
224 static size_t group_count;
225 static struct group * section_groups;
226 static struct group ** section_headers_groups;
227
228
229 /* Flag bits indicating particular types of dump. */
230 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
231 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
232 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
233 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
234 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
235
236 typedef unsigned char dump_type;
237
238 /* A linked list of the section names for which dumps were requested. */
239 struct dump_list_entry
240 {
241 char * name;
242 dump_type type;
243 struct dump_list_entry * next;
244 };
245 static struct dump_list_entry * dump_sects_byname;
246
247 /* A dynamic array of flags indicating for which sections a dump
248 has been requested via command line switches. */
249 static dump_type * cmdline_dump_sects = NULL;
250 static unsigned int num_cmdline_dump_sects = 0;
251
252 /* A dynamic array of flags indicating for which sections a dump of
253 some kind has been requested. It is reset on a per-object file
254 basis and then initialised from the cmdline_dump_sects array,
255 the results of interpreting the -w switch, and the
256 dump_sects_byname list. */
257 static dump_type * dump_sects = NULL;
258 static unsigned int num_dump_sects = 0;
259
260
261 /* How to print a vma value. */
262 typedef enum print_mode
263 {
264 HEX,
265 DEC,
266 DEC_5,
267 UNSIGNED,
268 PREFIX_HEX,
269 FULL_HEX,
270 LONG_HEX
271 }
272 print_mode;
273
274 #define UNKNOWN -1
275
276 #define SECTION_NAME(X) \
277 ((X) == NULL ? _("<none>") \
278 : string_table == NULL ? _("<no-name>") \
279 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
280 : string_table + (X)->sh_name))
281
282 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
283
284 #define GET_ELF_SYMBOLS(file, section, sym_count) \
285 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
286 : get_64bit_elf_symbols (file, section, sym_count))
287
288 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
289 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
290 already been called and verified that the string exists. */
291 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
292
293 #define REMOVE_ARCH_BITS(ADDR) \
294 do \
295 { \
296 if (elf_header.e_machine == EM_ARM) \
297 (ADDR) &= ~1; \
298 } \
299 while (0)
300 \f
301 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
302 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
303 using malloc and fill that. In either case return the pointer to the start of
304 the retrieved data or NULL if something went wrong. If something does go wrong
305 emit an error message using REASON as part of the context. */
306
307 static void *
308 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
309 const char * reason)
310 {
311 void * mvar;
312
313 if (size == 0 || nmemb == 0)
314 return NULL;
315
316 if (fseek (file, archive_file_offset + offset, SEEK_SET))
317 {
318 error (_("Unable to seek to 0x%lx for %s\n"),
319 (unsigned long) archive_file_offset + offset, reason);
320 return NULL;
321 }
322
323 mvar = var;
324 if (mvar == NULL)
325 {
326 /* Check for overflow. */
327 if (nmemb < (~(size_t) 0 - 1) / size)
328 /* + 1 so that we can '\0' terminate invalid string table sections. */
329 mvar = malloc (size * nmemb + 1);
330
331 if (mvar == NULL)
332 {
333 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
334 (unsigned long)(size * nmemb), reason);
335 return NULL;
336 }
337
338 ((char *) mvar)[size * nmemb] = '\0';
339 }
340
341 if (fread (mvar, size, nmemb, file) != nmemb)
342 {
343 error (_("Unable to read in 0x%lx bytes of %s\n"),
344 (unsigned long)(size * nmemb), reason);
345 if (mvar != var)
346 free (mvar);
347 return NULL;
348 }
349
350 return mvar;
351 }
352
353 /* Print a VMA value. */
354
355 static int
356 print_vma (bfd_vma vma, print_mode mode)
357 {
358 int nc = 0;
359
360 switch (mode)
361 {
362 case FULL_HEX:
363 nc = printf ("0x");
364 /* Drop through. */
365
366 case LONG_HEX:
367 #ifdef BFD64
368 if (is_32bit_elf)
369 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
370 #endif
371 printf_vma (vma);
372 return nc + 16;
373
374 case DEC_5:
375 if (vma <= 99999)
376 return printf ("%5" BFD_VMA_FMT "d", vma);
377 /* Drop through. */
378
379 case PREFIX_HEX:
380 nc = printf ("0x");
381 /* Drop through. */
382
383 case HEX:
384 return nc + printf ("%" BFD_VMA_FMT "x", vma);
385
386 case DEC:
387 return printf ("%" BFD_VMA_FMT "d", vma);
388
389 case UNSIGNED:
390 return printf ("%" BFD_VMA_FMT "u", vma);
391 }
392 return 0;
393 }
394
395 /* Display a symbol on stdout. Handles the display of control characters and
396 multibye characters (assuming the host environment supports them).
397
398 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
399
400 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
401 padding as necessary.
402
403 Returns the number of emitted characters. */
404
405 static unsigned int
406 print_symbol (int width, const char *symbol)
407 {
408 bfd_boolean extra_padding = FALSE;
409 int num_printed = 0;
410 #ifdef HAVE_MBSTATE_T
411 mbstate_t state;
412 #endif
413 int width_remaining;
414
415 if (width < 0)
416 {
417 /* Keep the width positive. This also helps. */
418 width = - width;
419 extra_padding = TRUE;
420 }
421
422 if (do_wide)
423 /* Set the remaining width to a very large value.
424 This simplifies the code below. */
425 width_remaining = INT_MAX;
426 else
427 width_remaining = width;
428
429 #ifdef HAVE_MBSTATE_T
430 /* Initialise the multibyte conversion state. */
431 memset (& state, 0, sizeof (state));
432 #endif
433
434 while (width_remaining)
435 {
436 size_t n;
437 const char c = *symbol++;
438
439 if (c == 0)
440 break;
441
442 /* Do not print control characters directly as they can affect terminal
443 settings. Such characters usually appear in the names generated
444 by the assembler for local labels. */
445 if (ISCNTRL (c))
446 {
447 if (width_remaining < 2)
448 break;
449
450 printf ("^%c", c + 0x40);
451 width_remaining -= 2;
452 num_printed += 2;
453 }
454 else if (ISPRINT (c))
455 {
456 putchar (c);
457 width_remaining --;
458 num_printed ++;
459 }
460 else
461 {
462 #ifdef HAVE_MBSTATE_T
463 wchar_t w;
464 #endif
465 /* Let printf do the hard work of displaying multibyte characters. */
466 printf ("%.1s", symbol - 1);
467 width_remaining --;
468 num_printed ++;
469
470 #ifdef HAVE_MBSTATE_T
471 /* Try to find out how many bytes made up the character that was
472 just printed. Advance the symbol pointer past the bytes that
473 were displayed. */
474 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
475 #else
476 n = 1;
477 #endif
478 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
479 symbol += (n - 1);
480 }
481 }
482
483 if (extra_padding && num_printed < width)
484 {
485 /* Fill in the remaining spaces. */
486 printf ("%-*s", width - num_printed, " ");
487 num_printed = width;
488 }
489
490 return num_printed;
491 }
492
493 /* Return a pointer to section NAME, or NULL if no such section exists. */
494
495 static Elf_Internal_Shdr *
496 find_section (const char * name)
497 {
498 unsigned int i;
499
500 for (i = 0; i < elf_header.e_shnum; i++)
501 if (streq (SECTION_NAME (section_headers + i), name))
502 return section_headers + i;
503
504 return NULL;
505 }
506
507 /* Return a pointer to a section containing ADDR, or NULL if no such
508 section exists. */
509
510 static Elf_Internal_Shdr *
511 find_section_by_address (bfd_vma addr)
512 {
513 unsigned int i;
514
515 for (i = 0; i < elf_header.e_shnum; i++)
516 {
517 Elf_Internal_Shdr *sec = section_headers + i;
518 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
519 return sec;
520 }
521
522 return NULL;
523 }
524
525 /* Return a pointer to section NAME, or NULL if no such section exists,
526 restricted to the list of sections given in SET. */
527
528 static Elf_Internal_Shdr *
529 find_section_in_set (const char * name, unsigned int * set)
530 {
531 unsigned int i;
532
533 if (set != NULL)
534 {
535 while ((i = *set++) > 0)
536 if (streq (SECTION_NAME (section_headers + i), name))
537 return section_headers + i;
538 }
539
540 return find_section (name);
541 }
542
543 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
544 bytes read. */
545
546 static unsigned long
547 read_uleb128 (unsigned char *data, unsigned int *length_return)
548 {
549 return read_leb128 (data, length_return, 0);
550 }
551
552 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
553 This OS has so many departures from the ELF standard that we test it at
554 many places. */
555
556 static inline int
557 is_ia64_vms (void)
558 {
559 return elf_header.e_machine == EM_IA_64
560 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
561 }
562
563 /* Guess the relocation size commonly used by the specific machines. */
564
565 static int
566 guess_is_rela (unsigned int e_machine)
567 {
568 switch (e_machine)
569 {
570 /* Targets that use REL relocations. */
571 case EM_386:
572 case EM_486:
573 case EM_960:
574 case EM_ARM:
575 case EM_D10V:
576 case EM_CYGNUS_D10V:
577 case EM_DLX:
578 case EM_MIPS:
579 case EM_MIPS_RS3_LE:
580 case EM_CYGNUS_M32R:
581 case EM_OPENRISC:
582 case EM_OR32:
583 case EM_SCORE:
584 case EM_XGATE:
585 return FALSE;
586
587 /* Targets that use RELA relocations. */
588 case EM_68K:
589 case EM_860:
590 case EM_AARCH64:
591 case EM_ADAPTEVA_EPIPHANY:
592 case EM_ALPHA:
593 case EM_ALTERA_NIOS2:
594 case EM_AVR:
595 case EM_AVR_OLD:
596 case EM_BLACKFIN:
597 case EM_CR16:
598 case EM_CRIS:
599 case EM_CRX:
600 case EM_D30V:
601 case EM_CYGNUS_D30V:
602 case EM_FR30:
603 case EM_CYGNUS_FR30:
604 case EM_CYGNUS_FRV:
605 case EM_H8S:
606 case EM_H8_300:
607 case EM_H8_300H:
608 case EM_IA_64:
609 case EM_IP2K:
610 case EM_IP2K_OLD:
611 case EM_IQ2000:
612 case EM_LATTICEMICO32:
613 case EM_M32C_OLD:
614 case EM_M32C:
615 case EM_M32R:
616 case EM_MCORE:
617 case EM_CYGNUS_MEP:
618 case EM_METAG:
619 case EM_MMIX:
620 case EM_MN10200:
621 case EM_CYGNUS_MN10200:
622 case EM_MN10300:
623 case EM_CYGNUS_MN10300:
624 case EM_MOXIE:
625 case EM_MSP430:
626 case EM_MSP430_OLD:
627 case EM_MT:
628 case EM_NIOS32:
629 case EM_PPC64:
630 case EM_PPC:
631 case EM_RL78:
632 case EM_RX:
633 case EM_S390:
634 case EM_S390_OLD:
635 case EM_SH:
636 case EM_SPARC:
637 case EM_SPARC32PLUS:
638 case EM_SPARCV9:
639 case EM_SPU:
640 case EM_TI_C6000:
641 case EM_TILEGX:
642 case EM_TILEPRO:
643 case EM_V800:
644 case EM_V850:
645 case EM_CYGNUS_V850:
646 case EM_VAX:
647 case EM_X86_64:
648 case EM_L1OM:
649 case EM_K1OM:
650 case EM_XSTORMY16:
651 case EM_XTENSA:
652 case EM_XTENSA_OLD:
653 case EM_MICROBLAZE:
654 case EM_MICROBLAZE_OLD:
655 return TRUE;
656
657 case EM_68HC05:
658 case EM_68HC08:
659 case EM_68HC11:
660 case EM_68HC16:
661 case EM_FX66:
662 case EM_ME16:
663 case EM_MMA:
664 case EM_NCPU:
665 case EM_NDR1:
666 case EM_PCP:
667 case EM_ST100:
668 case EM_ST19:
669 case EM_ST7:
670 case EM_ST9PLUS:
671 case EM_STARCORE:
672 case EM_SVX:
673 case EM_TINYJ:
674 default:
675 warn (_("Don't know about relocations on this machine architecture\n"));
676 return FALSE;
677 }
678 }
679
680 static int
681 slurp_rela_relocs (FILE * file,
682 unsigned long rel_offset,
683 unsigned long rel_size,
684 Elf_Internal_Rela ** relasp,
685 unsigned long * nrelasp)
686 {
687 Elf_Internal_Rela * relas;
688 unsigned long nrelas;
689 unsigned int i;
690
691 if (is_32bit_elf)
692 {
693 Elf32_External_Rela * erelas;
694
695 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
696 rel_size, _("32-bit relocation data"));
697 if (!erelas)
698 return 0;
699
700 nrelas = rel_size / sizeof (Elf32_External_Rela);
701
702 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
703 sizeof (Elf_Internal_Rela));
704
705 if (relas == NULL)
706 {
707 free (erelas);
708 error (_("out of memory parsing relocs\n"));
709 return 0;
710 }
711
712 for (i = 0; i < nrelas; i++)
713 {
714 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
715 relas[i].r_info = BYTE_GET (erelas[i].r_info);
716 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
717 }
718
719 free (erelas);
720 }
721 else
722 {
723 Elf64_External_Rela * erelas;
724
725 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
726 rel_size, _("64-bit relocation data"));
727 if (!erelas)
728 return 0;
729
730 nrelas = rel_size / sizeof (Elf64_External_Rela);
731
732 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
733 sizeof (Elf_Internal_Rela));
734
735 if (relas == NULL)
736 {
737 free (erelas);
738 error (_("out of memory parsing relocs\n"));
739 return 0;
740 }
741
742 for (i = 0; i < nrelas; i++)
743 {
744 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
745 relas[i].r_info = BYTE_GET (erelas[i].r_info);
746 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
747
748 /* The #ifdef BFD64 below is to prevent a compile time
749 warning. We know that if we do not have a 64 bit data
750 type that we will never execute this code anyway. */
751 #ifdef BFD64
752 if (elf_header.e_machine == EM_MIPS
753 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
754 {
755 /* In little-endian objects, r_info isn't really a
756 64-bit little-endian value: it has a 32-bit
757 little-endian symbol index followed by four
758 individual byte fields. Reorder INFO
759 accordingly. */
760 bfd_vma inf = relas[i].r_info;
761 inf = (((inf & 0xffffffff) << 32)
762 | ((inf >> 56) & 0xff)
763 | ((inf >> 40) & 0xff00)
764 | ((inf >> 24) & 0xff0000)
765 | ((inf >> 8) & 0xff000000));
766 relas[i].r_info = inf;
767 }
768 #endif /* BFD64 */
769 }
770
771 free (erelas);
772 }
773 *relasp = relas;
774 *nrelasp = nrelas;
775 return 1;
776 }
777
778 static int
779 slurp_rel_relocs (FILE * file,
780 unsigned long rel_offset,
781 unsigned long rel_size,
782 Elf_Internal_Rela ** relsp,
783 unsigned long * nrelsp)
784 {
785 Elf_Internal_Rela * rels;
786 unsigned long nrels;
787 unsigned int i;
788
789 if (is_32bit_elf)
790 {
791 Elf32_External_Rel * erels;
792
793 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
794 rel_size, _("32-bit relocation data"));
795 if (!erels)
796 return 0;
797
798 nrels = rel_size / sizeof (Elf32_External_Rel);
799
800 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
801
802 if (rels == NULL)
803 {
804 free (erels);
805 error (_("out of memory parsing relocs\n"));
806 return 0;
807 }
808
809 for (i = 0; i < nrels; i++)
810 {
811 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
812 rels[i].r_info = BYTE_GET (erels[i].r_info);
813 rels[i].r_addend = 0;
814 }
815
816 free (erels);
817 }
818 else
819 {
820 Elf64_External_Rel * erels;
821
822 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
823 rel_size, _("64-bit relocation data"));
824 if (!erels)
825 return 0;
826
827 nrels = rel_size / sizeof (Elf64_External_Rel);
828
829 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
830
831 if (rels == NULL)
832 {
833 free (erels);
834 error (_("out of memory parsing relocs\n"));
835 return 0;
836 }
837
838 for (i = 0; i < nrels; i++)
839 {
840 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
841 rels[i].r_info = BYTE_GET (erels[i].r_info);
842 rels[i].r_addend = 0;
843
844 /* The #ifdef BFD64 below is to prevent a compile time
845 warning. We know that if we do not have a 64 bit data
846 type that we will never execute this code anyway. */
847 #ifdef BFD64
848 if (elf_header.e_machine == EM_MIPS
849 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
850 {
851 /* In little-endian objects, r_info isn't really a
852 64-bit little-endian value: it has a 32-bit
853 little-endian symbol index followed by four
854 individual byte fields. Reorder INFO
855 accordingly. */
856 bfd_vma inf = rels[i].r_info;
857 inf = (((inf & 0xffffffff) << 32)
858 | ((inf >> 56) & 0xff)
859 | ((inf >> 40) & 0xff00)
860 | ((inf >> 24) & 0xff0000)
861 | ((inf >> 8) & 0xff000000));
862 rels[i].r_info = inf;
863 }
864 #endif /* BFD64 */
865 }
866
867 free (erels);
868 }
869 *relsp = rels;
870 *nrelsp = nrels;
871 return 1;
872 }
873
874 /* Returns the reloc type extracted from the reloc info field. */
875
876 static unsigned int
877 get_reloc_type (bfd_vma reloc_info)
878 {
879 if (is_32bit_elf)
880 return ELF32_R_TYPE (reloc_info);
881
882 switch (elf_header.e_machine)
883 {
884 case EM_MIPS:
885 /* Note: We assume that reloc_info has already been adjusted for us. */
886 return ELF64_MIPS_R_TYPE (reloc_info);
887
888 case EM_SPARCV9:
889 return ELF64_R_TYPE_ID (reloc_info);
890
891 default:
892 return ELF64_R_TYPE (reloc_info);
893 }
894 }
895
896 /* Return the symbol index extracted from the reloc info field. */
897
898 static bfd_vma
899 get_reloc_symindex (bfd_vma reloc_info)
900 {
901 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
902 }
903
904 /* Display the contents of the relocation data found at the specified
905 offset. */
906
907 static void
908 dump_relocations (FILE * file,
909 unsigned long rel_offset,
910 unsigned long rel_size,
911 Elf_Internal_Sym * symtab,
912 unsigned long nsyms,
913 char * strtab,
914 unsigned long strtablen,
915 int is_rela)
916 {
917 unsigned int i;
918 Elf_Internal_Rela * rels;
919
920 if (is_rela == UNKNOWN)
921 is_rela = guess_is_rela (elf_header.e_machine);
922
923 if (is_rela)
924 {
925 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
926 return;
927 }
928 else
929 {
930 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
931 return;
932 }
933
934 if (is_32bit_elf)
935 {
936 if (is_rela)
937 {
938 if (do_wide)
939 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
940 else
941 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
942 }
943 else
944 {
945 if (do_wide)
946 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
947 else
948 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
949 }
950 }
951 else
952 {
953 if (is_rela)
954 {
955 if (do_wide)
956 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
957 else
958 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
959 }
960 else
961 {
962 if (do_wide)
963 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
964 else
965 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
966 }
967 }
968
969 for (i = 0; i < rel_size; i++)
970 {
971 const char * rtype;
972 bfd_vma offset;
973 bfd_vma inf;
974 bfd_vma symtab_index;
975 bfd_vma type;
976
977 offset = rels[i].r_offset;
978 inf = rels[i].r_info;
979
980 type = get_reloc_type (inf);
981 symtab_index = get_reloc_symindex (inf);
982
983 if (is_32bit_elf)
984 {
985 printf ("%8.8lx %8.8lx ",
986 (unsigned long) offset & 0xffffffff,
987 (unsigned long) inf & 0xffffffff);
988 }
989 else
990 {
991 #if BFD_HOST_64BIT_LONG
992 printf (do_wide
993 ? "%16.16lx %16.16lx "
994 : "%12.12lx %12.12lx ",
995 offset, inf);
996 #elif BFD_HOST_64BIT_LONG_LONG
997 #ifndef __MSVCRT__
998 printf (do_wide
999 ? "%16.16llx %16.16llx "
1000 : "%12.12llx %12.12llx ",
1001 offset, inf);
1002 #else
1003 printf (do_wide
1004 ? "%16.16I64x %16.16I64x "
1005 : "%12.12I64x %12.12I64x ",
1006 offset, inf);
1007 #endif
1008 #else
1009 printf (do_wide
1010 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1011 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1012 _bfd_int64_high (offset),
1013 _bfd_int64_low (offset),
1014 _bfd_int64_high (inf),
1015 _bfd_int64_low (inf));
1016 #endif
1017 }
1018
1019 switch (elf_header.e_machine)
1020 {
1021 default:
1022 rtype = NULL;
1023 break;
1024
1025 case EM_AARCH64:
1026 rtype = elf_aarch64_reloc_type (type);
1027 break;
1028
1029 case EM_M32R:
1030 case EM_CYGNUS_M32R:
1031 rtype = elf_m32r_reloc_type (type);
1032 break;
1033
1034 case EM_386:
1035 case EM_486:
1036 rtype = elf_i386_reloc_type (type);
1037 break;
1038
1039 case EM_68HC11:
1040 case EM_68HC12:
1041 rtype = elf_m68hc11_reloc_type (type);
1042 break;
1043
1044 case EM_68K:
1045 rtype = elf_m68k_reloc_type (type);
1046 break;
1047
1048 case EM_960:
1049 rtype = elf_i960_reloc_type (type);
1050 break;
1051
1052 case EM_AVR:
1053 case EM_AVR_OLD:
1054 rtype = elf_avr_reloc_type (type);
1055 break;
1056
1057 case EM_OLD_SPARCV9:
1058 case EM_SPARC32PLUS:
1059 case EM_SPARCV9:
1060 case EM_SPARC:
1061 rtype = elf_sparc_reloc_type (type);
1062 break;
1063
1064 case EM_SPU:
1065 rtype = elf_spu_reloc_type (type);
1066 break;
1067
1068 case EM_V800:
1069 rtype = v800_reloc_type (type);
1070 break;
1071 case EM_V850:
1072 case EM_CYGNUS_V850:
1073 rtype = v850_reloc_type (type);
1074 break;
1075
1076 case EM_D10V:
1077 case EM_CYGNUS_D10V:
1078 rtype = elf_d10v_reloc_type (type);
1079 break;
1080
1081 case EM_D30V:
1082 case EM_CYGNUS_D30V:
1083 rtype = elf_d30v_reloc_type (type);
1084 break;
1085
1086 case EM_DLX:
1087 rtype = elf_dlx_reloc_type (type);
1088 break;
1089
1090 case EM_SH:
1091 rtype = elf_sh_reloc_type (type);
1092 break;
1093
1094 case EM_MN10300:
1095 case EM_CYGNUS_MN10300:
1096 rtype = elf_mn10300_reloc_type (type);
1097 break;
1098
1099 case EM_MN10200:
1100 case EM_CYGNUS_MN10200:
1101 rtype = elf_mn10200_reloc_type (type);
1102 break;
1103
1104 case EM_FR30:
1105 case EM_CYGNUS_FR30:
1106 rtype = elf_fr30_reloc_type (type);
1107 break;
1108
1109 case EM_CYGNUS_FRV:
1110 rtype = elf_frv_reloc_type (type);
1111 break;
1112
1113 case EM_MCORE:
1114 rtype = elf_mcore_reloc_type (type);
1115 break;
1116
1117 case EM_MMIX:
1118 rtype = elf_mmix_reloc_type (type);
1119 break;
1120
1121 case EM_MOXIE:
1122 rtype = elf_moxie_reloc_type (type);
1123 break;
1124
1125 case EM_MSP430:
1126 case EM_MSP430_OLD:
1127 rtype = elf_msp430_reloc_type (type);
1128 break;
1129
1130 case EM_PPC:
1131 rtype = elf_ppc_reloc_type (type);
1132 break;
1133
1134 case EM_PPC64:
1135 rtype = elf_ppc64_reloc_type (type);
1136 break;
1137
1138 case EM_MIPS:
1139 case EM_MIPS_RS3_LE:
1140 rtype = elf_mips_reloc_type (type);
1141 break;
1142
1143 case EM_ALPHA:
1144 rtype = elf_alpha_reloc_type (type);
1145 break;
1146
1147 case EM_ARM:
1148 rtype = elf_arm_reloc_type (type);
1149 break;
1150
1151 case EM_ARC:
1152 rtype = elf_arc_reloc_type (type);
1153 break;
1154
1155 case EM_PARISC:
1156 rtype = elf_hppa_reloc_type (type);
1157 break;
1158
1159 case EM_H8_300:
1160 case EM_H8_300H:
1161 case EM_H8S:
1162 rtype = elf_h8_reloc_type (type);
1163 break;
1164
1165 case EM_OPENRISC:
1166 case EM_OR32:
1167 rtype = elf_or32_reloc_type (type);
1168 break;
1169
1170 case EM_PJ:
1171 case EM_PJ_OLD:
1172 rtype = elf_pj_reloc_type (type);
1173 break;
1174 case EM_IA_64:
1175 rtype = elf_ia64_reloc_type (type);
1176 break;
1177
1178 case EM_CRIS:
1179 rtype = elf_cris_reloc_type (type);
1180 break;
1181
1182 case EM_860:
1183 rtype = elf_i860_reloc_type (type);
1184 break;
1185
1186 case EM_X86_64:
1187 case EM_L1OM:
1188 case EM_K1OM:
1189 rtype = elf_x86_64_reloc_type (type);
1190 break;
1191
1192 case EM_S370:
1193 rtype = i370_reloc_type (type);
1194 break;
1195
1196 case EM_S390_OLD:
1197 case EM_S390:
1198 rtype = elf_s390_reloc_type (type);
1199 break;
1200
1201 case EM_SCORE:
1202 rtype = elf_score_reloc_type (type);
1203 break;
1204
1205 case EM_XSTORMY16:
1206 rtype = elf_xstormy16_reloc_type (type);
1207 break;
1208
1209 case EM_CRX:
1210 rtype = elf_crx_reloc_type (type);
1211 break;
1212
1213 case EM_VAX:
1214 rtype = elf_vax_reloc_type (type);
1215 break;
1216
1217 case EM_ADAPTEVA_EPIPHANY:
1218 rtype = elf_epiphany_reloc_type (type);
1219 break;
1220
1221 case EM_IP2K:
1222 case EM_IP2K_OLD:
1223 rtype = elf_ip2k_reloc_type (type);
1224 break;
1225
1226 case EM_IQ2000:
1227 rtype = elf_iq2000_reloc_type (type);
1228 break;
1229
1230 case EM_XTENSA_OLD:
1231 case EM_XTENSA:
1232 rtype = elf_xtensa_reloc_type (type);
1233 break;
1234
1235 case EM_LATTICEMICO32:
1236 rtype = elf_lm32_reloc_type (type);
1237 break;
1238
1239 case EM_M32C_OLD:
1240 case EM_M32C:
1241 rtype = elf_m32c_reloc_type (type);
1242 break;
1243
1244 case EM_MT:
1245 rtype = elf_mt_reloc_type (type);
1246 break;
1247
1248 case EM_BLACKFIN:
1249 rtype = elf_bfin_reloc_type (type);
1250 break;
1251
1252 case EM_CYGNUS_MEP:
1253 rtype = elf_mep_reloc_type (type);
1254 break;
1255
1256 case EM_CR16:
1257 rtype = elf_cr16_reloc_type (type);
1258 break;
1259
1260 case EM_MICROBLAZE:
1261 case EM_MICROBLAZE_OLD:
1262 rtype = elf_microblaze_reloc_type (type);
1263 break;
1264
1265 case EM_RL78:
1266 rtype = elf_rl78_reloc_type (type);
1267 break;
1268
1269 case EM_RX:
1270 rtype = elf_rx_reloc_type (type);
1271 break;
1272
1273 case EM_METAG:
1274 rtype = elf_metag_reloc_type (type);
1275 break;
1276
1277 case EM_XC16X:
1278 case EM_C166:
1279 rtype = elf_xc16x_reloc_type (type);
1280 break;
1281
1282 case EM_TI_C6000:
1283 rtype = elf_tic6x_reloc_type (type);
1284 break;
1285
1286 case EM_TILEGX:
1287 rtype = elf_tilegx_reloc_type (type);
1288 break;
1289
1290 case EM_TILEPRO:
1291 rtype = elf_tilepro_reloc_type (type);
1292 break;
1293
1294 case EM_XGATE:
1295 rtype = elf_xgate_reloc_type (type);
1296 break;
1297
1298 case EM_ALTERA_NIOS2:
1299 rtype = elf_nios2_reloc_type (type);
1300 break;
1301 }
1302
1303 if (rtype == NULL)
1304 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1305 else
1306 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1307
1308 if (elf_header.e_machine == EM_ALPHA
1309 && rtype != NULL
1310 && streq (rtype, "R_ALPHA_LITUSE")
1311 && is_rela)
1312 {
1313 switch (rels[i].r_addend)
1314 {
1315 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1316 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1317 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1318 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1319 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1320 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1321 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1322 default: rtype = NULL;
1323 }
1324 if (rtype)
1325 printf (" (%s)", rtype);
1326 else
1327 {
1328 putchar (' ');
1329 printf (_("<unknown addend: %lx>"),
1330 (unsigned long) rels[i].r_addend);
1331 }
1332 }
1333 else if (symtab_index)
1334 {
1335 if (symtab == NULL || symtab_index >= nsyms)
1336 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1337 else
1338 {
1339 Elf_Internal_Sym * psym;
1340
1341 psym = symtab + symtab_index;
1342
1343 printf (" ");
1344
1345 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1346 {
1347 const char * name;
1348 unsigned int len;
1349 unsigned int width = is_32bit_elf ? 8 : 14;
1350
1351 /* Relocations against GNU_IFUNC symbols do not use the value
1352 of the symbol as the address to relocate against. Instead
1353 they invoke the function named by the symbol and use its
1354 result as the address for relocation.
1355
1356 To indicate this to the user, do not display the value of
1357 the symbol in the "Symbols's Value" field. Instead show
1358 its name followed by () as a hint that the symbol is
1359 invoked. */
1360
1361 if (strtab == NULL
1362 || psym->st_name == 0
1363 || psym->st_name >= strtablen)
1364 name = "??";
1365 else
1366 name = strtab + psym->st_name;
1367
1368 len = print_symbol (width, name);
1369 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1370 }
1371 else
1372 {
1373 print_vma (psym->st_value, LONG_HEX);
1374
1375 printf (is_32bit_elf ? " " : " ");
1376 }
1377
1378 if (psym->st_name == 0)
1379 {
1380 const char * sec_name = "<null>";
1381 char name_buf[40];
1382
1383 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1384 {
1385 if (psym->st_shndx < elf_header.e_shnum)
1386 sec_name
1387 = SECTION_NAME (section_headers + psym->st_shndx);
1388 else if (psym->st_shndx == SHN_ABS)
1389 sec_name = "ABS";
1390 else if (psym->st_shndx == SHN_COMMON)
1391 sec_name = "COMMON";
1392 else if ((elf_header.e_machine == EM_MIPS
1393 && psym->st_shndx == SHN_MIPS_SCOMMON)
1394 || (elf_header.e_machine == EM_TI_C6000
1395 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1396 sec_name = "SCOMMON";
1397 else if (elf_header.e_machine == EM_MIPS
1398 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1399 sec_name = "SUNDEF";
1400 else if ((elf_header.e_machine == EM_X86_64
1401 || elf_header.e_machine == EM_L1OM
1402 || elf_header.e_machine == EM_K1OM)
1403 && psym->st_shndx == SHN_X86_64_LCOMMON)
1404 sec_name = "LARGE_COMMON";
1405 else if (elf_header.e_machine == EM_IA_64
1406 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1407 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1408 sec_name = "ANSI_COM";
1409 else if (is_ia64_vms ()
1410 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1411 sec_name = "VMS_SYMVEC";
1412 else
1413 {
1414 sprintf (name_buf, "<section 0x%x>",
1415 (unsigned int) psym->st_shndx);
1416 sec_name = name_buf;
1417 }
1418 }
1419 print_symbol (22, sec_name);
1420 }
1421 else if (strtab == NULL)
1422 printf (_("<string table index: %3ld>"), psym->st_name);
1423 else if (psym->st_name >= strtablen)
1424 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1425 else
1426 print_symbol (22, strtab + psym->st_name);
1427
1428 if (is_rela)
1429 {
1430 bfd_signed_vma off = rels[i].r_addend;
1431
1432 if (off < 0)
1433 printf (" - %" BFD_VMA_FMT "x", - off);
1434 else
1435 printf (" + %" BFD_VMA_FMT "x", off);
1436 }
1437 }
1438 }
1439 else if (is_rela)
1440 {
1441 bfd_signed_vma off = rels[i].r_addend;
1442
1443 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1444 if (off < 0)
1445 printf ("-%" BFD_VMA_FMT "x", - off);
1446 else
1447 printf ("%" BFD_VMA_FMT "x", off);
1448 }
1449
1450 if (elf_header.e_machine == EM_SPARCV9
1451 && rtype != NULL
1452 && streq (rtype, "R_SPARC_OLO10"))
1453 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1454
1455 putchar ('\n');
1456
1457 #ifdef BFD64
1458 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1459 {
1460 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1461 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1462 const char * rtype2 = elf_mips_reloc_type (type2);
1463 const char * rtype3 = elf_mips_reloc_type (type3);
1464
1465 printf (" Type2: ");
1466
1467 if (rtype2 == NULL)
1468 printf (_("unrecognized: %-7lx"),
1469 (unsigned long) type2 & 0xffffffff);
1470 else
1471 printf ("%-17.17s", rtype2);
1472
1473 printf ("\n Type3: ");
1474
1475 if (rtype3 == NULL)
1476 printf (_("unrecognized: %-7lx"),
1477 (unsigned long) type3 & 0xffffffff);
1478 else
1479 printf ("%-17.17s", rtype3);
1480
1481 putchar ('\n');
1482 }
1483 #endif /* BFD64 */
1484 }
1485
1486 free (rels);
1487 }
1488
1489 static const char *
1490 get_mips_dynamic_type (unsigned long type)
1491 {
1492 switch (type)
1493 {
1494 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1495 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1496 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1497 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1498 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1499 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1500 case DT_MIPS_MSYM: return "MIPS_MSYM";
1501 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1502 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1503 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1504 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1505 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1506 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1507 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1508 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1509 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1510 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1511 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1512 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1513 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1514 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1515 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1516 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1517 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1518 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1519 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1520 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1521 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1522 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1523 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1524 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1525 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1526 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1527 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1528 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1529 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1530 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1531 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1532 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1533 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1534 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1535 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1536 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1537 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1538 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1539 default:
1540 return NULL;
1541 }
1542 }
1543
1544 static const char *
1545 get_sparc64_dynamic_type (unsigned long type)
1546 {
1547 switch (type)
1548 {
1549 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1550 default:
1551 return NULL;
1552 }
1553 }
1554
1555 static const char *
1556 get_ppc_dynamic_type (unsigned long type)
1557 {
1558 switch (type)
1559 {
1560 case DT_PPC_GOT: return "PPC_GOT";
1561 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1562 default:
1563 return NULL;
1564 }
1565 }
1566
1567 static const char *
1568 get_ppc64_dynamic_type (unsigned long type)
1569 {
1570 switch (type)
1571 {
1572 case DT_PPC64_GLINK: return "PPC64_GLINK";
1573 case DT_PPC64_OPD: return "PPC64_OPD";
1574 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1575 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1576 default:
1577 return NULL;
1578 }
1579 }
1580
1581 static const char *
1582 get_parisc_dynamic_type (unsigned long type)
1583 {
1584 switch (type)
1585 {
1586 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1587 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1588 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1589 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1590 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1591 case DT_HP_PREINIT: return "HP_PREINIT";
1592 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1593 case DT_HP_NEEDED: return "HP_NEEDED";
1594 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1595 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1596 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1597 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1598 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1599 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1600 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1601 case DT_HP_FILTERED: return "HP_FILTERED";
1602 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1603 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1604 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1605 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1606 case DT_PLT: return "PLT";
1607 case DT_PLT_SIZE: return "PLT_SIZE";
1608 case DT_DLT: return "DLT";
1609 case DT_DLT_SIZE: return "DLT_SIZE";
1610 default:
1611 return NULL;
1612 }
1613 }
1614
1615 static const char *
1616 get_ia64_dynamic_type (unsigned long type)
1617 {
1618 switch (type)
1619 {
1620 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1621 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1622 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1623 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1624 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1625 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1626 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1627 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1628 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1629 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1630 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1631 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1632 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1633 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1634 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1635 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1636 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1637 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1638 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1639 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1640 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1641 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1642 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1643 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1644 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1645 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1646 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1647 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1648 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1649 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1650 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1651 default:
1652 return NULL;
1653 }
1654 }
1655
1656 static const char *
1657 get_alpha_dynamic_type (unsigned long type)
1658 {
1659 switch (type)
1660 {
1661 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1662 default:
1663 return NULL;
1664 }
1665 }
1666
1667 static const char *
1668 get_score_dynamic_type (unsigned long type)
1669 {
1670 switch (type)
1671 {
1672 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1673 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1674 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1675 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1676 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1677 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1678 default:
1679 return NULL;
1680 }
1681 }
1682
1683 static const char *
1684 get_tic6x_dynamic_type (unsigned long type)
1685 {
1686 switch (type)
1687 {
1688 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1689 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1690 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1691 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1692 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1693 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1694 default:
1695 return NULL;
1696 }
1697 }
1698
1699 static const char *
1700 get_nios2_dynamic_type (unsigned long type)
1701 {
1702 switch (type)
1703 {
1704 case DT_NIOS2_GP: return "NIOS2_GP";
1705 default:
1706 return NULL;
1707 }
1708 }
1709
1710 static const char *
1711 get_dynamic_type (unsigned long type)
1712 {
1713 static char buff[64];
1714
1715 switch (type)
1716 {
1717 case DT_NULL: return "NULL";
1718 case DT_NEEDED: return "NEEDED";
1719 case DT_PLTRELSZ: return "PLTRELSZ";
1720 case DT_PLTGOT: return "PLTGOT";
1721 case DT_HASH: return "HASH";
1722 case DT_STRTAB: return "STRTAB";
1723 case DT_SYMTAB: return "SYMTAB";
1724 case DT_RELA: return "RELA";
1725 case DT_RELASZ: return "RELASZ";
1726 case DT_RELAENT: return "RELAENT";
1727 case DT_STRSZ: return "STRSZ";
1728 case DT_SYMENT: return "SYMENT";
1729 case DT_INIT: return "INIT";
1730 case DT_FINI: return "FINI";
1731 case DT_SONAME: return "SONAME";
1732 case DT_RPATH: return "RPATH";
1733 case DT_SYMBOLIC: return "SYMBOLIC";
1734 case DT_REL: return "REL";
1735 case DT_RELSZ: return "RELSZ";
1736 case DT_RELENT: return "RELENT";
1737 case DT_PLTREL: return "PLTREL";
1738 case DT_DEBUG: return "DEBUG";
1739 case DT_TEXTREL: return "TEXTREL";
1740 case DT_JMPREL: return "JMPREL";
1741 case DT_BIND_NOW: return "BIND_NOW";
1742 case DT_INIT_ARRAY: return "INIT_ARRAY";
1743 case DT_FINI_ARRAY: return "FINI_ARRAY";
1744 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1745 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1746 case DT_RUNPATH: return "RUNPATH";
1747 case DT_FLAGS: return "FLAGS";
1748
1749 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1750 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1751
1752 case DT_CHECKSUM: return "CHECKSUM";
1753 case DT_PLTPADSZ: return "PLTPADSZ";
1754 case DT_MOVEENT: return "MOVEENT";
1755 case DT_MOVESZ: return "MOVESZ";
1756 case DT_FEATURE: return "FEATURE";
1757 case DT_POSFLAG_1: return "POSFLAG_1";
1758 case DT_SYMINSZ: return "SYMINSZ";
1759 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1760
1761 case DT_ADDRRNGLO: return "ADDRRNGLO";
1762 case DT_CONFIG: return "CONFIG";
1763 case DT_DEPAUDIT: return "DEPAUDIT";
1764 case DT_AUDIT: return "AUDIT";
1765 case DT_PLTPAD: return "PLTPAD";
1766 case DT_MOVETAB: return "MOVETAB";
1767 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1768
1769 case DT_VERSYM: return "VERSYM";
1770
1771 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1772 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1773 case DT_RELACOUNT: return "RELACOUNT";
1774 case DT_RELCOUNT: return "RELCOUNT";
1775 case DT_FLAGS_1: return "FLAGS_1";
1776 case DT_VERDEF: return "VERDEF";
1777 case DT_VERDEFNUM: return "VERDEFNUM";
1778 case DT_VERNEED: return "VERNEED";
1779 case DT_VERNEEDNUM: return "VERNEEDNUM";
1780
1781 case DT_AUXILIARY: return "AUXILIARY";
1782 case DT_USED: return "USED";
1783 case DT_FILTER: return "FILTER";
1784
1785 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1786 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1787 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1788 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1789 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1790 case DT_GNU_HASH: return "GNU_HASH";
1791
1792 default:
1793 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1794 {
1795 const char * result;
1796
1797 switch (elf_header.e_machine)
1798 {
1799 case EM_MIPS:
1800 case EM_MIPS_RS3_LE:
1801 result = get_mips_dynamic_type (type);
1802 break;
1803 case EM_SPARCV9:
1804 result = get_sparc64_dynamic_type (type);
1805 break;
1806 case EM_PPC:
1807 result = get_ppc_dynamic_type (type);
1808 break;
1809 case EM_PPC64:
1810 result = get_ppc64_dynamic_type (type);
1811 break;
1812 case EM_IA_64:
1813 result = get_ia64_dynamic_type (type);
1814 break;
1815 case EM_ALPHA:
1816 result = get_alpha_dynamic_type (type);
1817 break;
1818 case EM_SCORE:
1819 result = get_score_dynamic_type (type);
1820 break;
1821 case EM_TI_C6000:
1822 result = get_tic6x_dynamic_type (type);
1823 break;
1824 case EM_ALTERA_NIOS2:
1825 result = get_nios2_dynamic_type (type);
1826 break;
1827 default:
1828 result = NULL;
1829 break;
1830 }
1831
1832 if (result != NULL)
1833 return result;
1834
1835 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1836 }
1837 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1838 || (elf_header.e_machine == EM_PARISC
1839 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1840 {
1841 const char * result;
1842
1843 switch (elf_header.e_machine)
1844 {
1845 case EM_PARISC:
1846 result = get_parisc_dynamic_type (type);
1847 break;
1848 case EM_IA_64:
1849 result = get_ia64_dynamic_type (type);
1850 break;
1851 default:
1852 result = NULL;
1853 break;
1854 }
1855
1856 if (result != NULL)
1857 return result;
1858
1859 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1860 type);
1861 }
1862 else
1863 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1864
1865 return buff;
1866 }
1867 }
1868
1869 static char *
1870 get_file_type (unsigned e_type)
1871 {
1872 static char buff[32];
1873
1874 switch (e_type)
1875 {
1876 case ET_NONE: return _("NONE (None)");
1877 case ET_REL: return _("REL (Relocatable file)");
1878 case ET_EXEC: return _("EXEC (Executable file)");
1879 case ET_DYN: return _("DYN (Shared object file)");
1880 case ET_CORE: return _("CORE (Core file)");
1881
1882 default:
1883 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1884 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1885 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1886 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1887 else
1888 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1889 return buff;
1890 }
1891 }
1892
1893 static char *
1894 get_machine_name (unsigned e_machine)
1895 {
1896 static char buff[64]; /* XXX */
1897
1898 switch (e_machine)
1899 {
1900 case EM_NONE: return _("None");
1901 case EM_AARCH64: return "AArch64";
1902 case EM_M32: return "WE32100";
1903 case EM_SPARC: return "Sparc";
1904 case EM_SPU: return "SPU";
1905 case EM_386: return "Intel 80386";
1906 case EM_68K: return "MC68000";
1907 case EM_88K: return "MC88000";
1908 case EM_486: return "Intel 80486";
1909 case EM_860: return "Intel 80860";
1910 case EM_MIPS: return "MIPS R3000";
1911 case EM_S370: return "IBM System/370";
1912 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1913 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1914 case EM_PARISC: return "HPPA";
1915 case EM_PPC_OLD: return "Power PC (old)";
1916 case EM_SPARC32PLUS: return "Sparc v8+" ;
1917 case EM_960: return "Intel 90860";
1918 case EM_PPC: return "PowerPC";
1919 case EM_PPC64: return "PowerPC64";
1920 case EM_FR20: return "Fujitsu FR20";
1921 case EM_RH32: return "TRW RH32";
1922 case EM_MCORE: return "MCORE";
1923 case EM_ARM: return "ARM";
1924 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1925 case EM_SH: return "Renesas / SuperH SH";
1926 case EM_SPARCV9: return "Sparc v9";
1927 case EM_TRICORE: return "Siemens Tricore";
1928 case EM_ARC: return "ARC";
1929 case EM_H8_300: return "Renesas H8/300";
1930 case EM_H8_300H: return "Renesas H8/300H";
1931 case EM_H8S: return "Renesas H8S";
1932 case EM_H8_500: return "Renesas H8/500";
1933 case EM_IA_64: return "Intel IA-64";
1934 case EM_MIPS_X: return "Stanford MIPS-X";
1935 case EM_COLDFIRE: return "Motorola Coldfire";
1936 case EM_ALPHA: return "Alpha";
1937 case EM_CYGNUS_D10V:
1938 case EM_D10V: return "d10v";
1939 case EM_CYGNUS_D30V:
1940 case EM_D30V: return "d30v";
1941 case EM_CYGNUS_M32R:
1942 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1943 case EM_CYGNUS_V850:
1944 case EM_V800: return "Renesas V850 (using RH850 ABI)";
1945 case EM_V850: return "Renesas V850";
1946 case EM_CYGNUS_MN10300:
1947 case EM_MN10300: return "mn10300";
1948 case EM_CYGNUS_MN10200:
1949 case EM_MN10200: return "mn10200";
1950 case EM_MOXIE: return "Moxie";
1951 case EM_CYGNUS_FR30:
1952 case EM_FR30: return "Fujitsu FR30";
1953 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1954 case EM_PJ_OLD:
1955 case EM_PJ: return "picoJava";
1956 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1957 case EM_PCP: return "Siemens PCP";
1958 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1959 case EM_NDR1: return "Denso NDR1 microprocesspr";
1960 case EM_STARCORE: return "Motorola Star*Core processor";
1961 case EM_ME16: return "Toyota ME16 processor";
1962 case EM_ST100: return "STMicroelectronics ST100 processor";
1963 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1964 case EM_PDSP: return "Sony DSP processor";
1965 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1966 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1967 case EM_FX66: return "Siemens FX66 microcontroller";
1968 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1969 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1970 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1971 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
1972 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1973 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1974 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1975 case EM_SVX: return "Silicon Graphics SVx";
1976 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1977 case EM_VAX: return "Digital VAX";
1978 case EM_AVR_OLD:
1979 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1980 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1981 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1982 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1983 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1984 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1985 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1986 case EM_PRISM: return "Vitesse Prism";
1987 case EM_X86_64: return "Advanced Micro Devices X86-64";
1988 case EM_L1OM: return "Intel L1OM";
1989 case EM_K1OM: return "Intel K1OM";
1990 case EM_S390_OLD:
1991 case EM_S390: return "IBM S/390";
1992 case EM_SCORE: return "SUNPLUS S+Core";
1993 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
1994 case EM_OPENRISC:
1995 case EM_OR32: return "OpenRISC";
1996 case EM_ARC_A5: return "ARC International ARCompact processor";
1997 case EM_CRX: return "National Semiconductor CRX microprocessor";
1998 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
1999 case EM_DLX: return "OpenDLX";
2000 case EM_IP2K_OLD:
2001 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2002 case EM_IQ2000: return "Vitesse IQ2000";
2003 case EM_XTENSA_OLD:
2004 case EM_XTENSA: return "Tensilica Xtensa Processor";
2005 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2006 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2007 case EM_NS32K: return "National Semiconductor 32000 series";
2008 case EM_TPC: return "Tenor Network TPC processor";
2009 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2010 case EM_MAX: return "MAX Processor";
2011 case EM_CR: return "National Semiconductor CompactRISC";
2012 case EM_F2MC16: return "Fujitsu F2MC16";
2013 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2014 case EM_LATTICEMICO32: return "Lattice Mico32";
2015 case EM_M32C_OLD:
2016 case EM_M32C: return "Renesas M32c";
2017 case EM_MT: return "Morpho Techologies MT processor";
2018 case EM_BLACKFIN: return "Analog Devices Blackfin";
2019 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2020 case EM_SEP: return "Sharp embedded microprocessor";
2021 case EM_ARCA: return "Arca RISC microprocessor";
2022 case EM_UNICORE: return "Unicore";
2023 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2024 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2025 case EM_NIOS32: return "Altera Nios";
2026 case EM_ALTERA_NIOS2: return "Altera Nios II";
2027 case EM_C166:
2028 case EM_XC16X: return "Infineon Technologies xc16x";
2029 case EM_M16C: return "Renesas M16C series microprocessors";
2030 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2031 case EM_CE: return "Freescale Communication Engine RISC core";
2032 case EM_TSK3000: return "Altium TSK3000 core";
2033 case EM_RS08: return "Freescale RS08 embedded processor";
2034 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2035 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2036 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2037 case EM_SE_C17: return "Seiko Epson C17 family";
2038 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2039 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2040 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2041 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2042 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2043 case EM_R32C: return "Renesas R32C series microprocessors";
2044 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2045 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2046 case EM_8051: return "Intel 8051 and variants";
2047 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2048 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2049 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2050 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2051 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2052 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2053 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2054 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2055 case EM_CR16:
2056 case EM_MICROBLAZE:
2057 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2058 case EM_RL78: return "Renesas RL78";
2059 case EM_RX: return "Renesas RX";
2060 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2061 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2062 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2063 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2064 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2065 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2066 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2067 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2068 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2069 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2070 case EM_CUDA: return "NVIDIA CUDA architecture";
2071 case EM_XGATE: return "Motorola XGATE embedded processor";
2072 default:
2073 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2074 return buff;
2075 }
2076 }
2077
2078 static void
2079 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2080 {
2081 unsigned eabi;
2082 int unknown = 0;
2083
2084 eabi = EF_ARM_EABI_VERSION (e_flags);
2085 e_flags &= ~ EF_ARM_EABIMASK;
2086
2087 /* Handle "generic" ARM flags. */
2088 if (e_flags & EF_ARM_RELEXEC)
2089 {
2090 strcat (buf, ", relocatable executable");
2091 e_flags &= ~ EF_ARM_RELEXEC;
2092 }
2093
2094 if (e_flags & EF_ARM_HASENTRY)
2095 {
2096 strcat (buf, ", has entry point");
2097 e_flags &= ~ EF_ARM_HASENTRY;
2098 }
2099
2100 /* Now handle EABI specific flags. */
2101 switch (eabi)
2102 {
2103 default:
2104 strcat (buf, ", <unrecognized EABI>");
2105 if (e_flags)
2106 unknown = 1;
2107 break;
2108
2109 case EF_ARM_EABI_VER1:
2110 strcat (buf, ", Version1 EABI");
2111 while (e_flags)
2112 {
2113 unsigned flag;
2114
2115 /* Process flags one bit at a time. */
2116 flag = e_flags & - e_flags;
2117 e_flags &= ~ flag;
2118
2119 switch (flag)
2120 {
2121 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2122 strcat (buf, ", sorted symbol tables");
2123 break;
2124
2125 default:
2126 unknown = 1;
2127 break;
2128 }
2129 }
2130 break;
2131
2132 case EF_ARM_EABI_VER2:
2133 strcat (buf, ", Version2 EABI");
2134 while (e_flags)
2135 {
2136 unsigned flag;
2137
2138 /* Process flags one bit at a time. */
2139 flag = e_flags & - e_flags;
2140 e_flags &= ~ flag;
2141
2142 switch (flag)
2143 {
2144 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2145 strcat (buf, ", sorted symbol tables");
2146 break;
2147
2148 case EF_ARM_DYNSYMSUSESEGIDX:
2149 strcat (buf, ", dynamic symbols use segment index");
2150 break;
2151
2152 case EF_ARM_MAPSYMSFIRST:
2153 strcat (buf, ", mapping symbols precede others");
2154 break;
2155
2156 default:
2157 unknown = 1;
2158 break;
2159 }
2160 }
2161 break;
2162
2163 case EF_ARM_EABI_VER3:
2164 strcat (buf, ", Version3 EABI");
2165 break;
2166
2167 case EF_ARM_EABI_VER4:
2168 strcat (buf, ", Version4 EABI");
2169 while (e_flags)
2170 {
2171 unsigned flag;
2172
2173 /* Process flags one bit at a time. */
2174 flag = e_flags & - e_flags;
2175 e_flags &= ~ flag;
2176
2177 switch (flag)
2178 {
2179 case EF_ARM_BE8:
2180 strcat (buf, ", BE8");
2181 break;
2182
2183 case EF_ARM_LE8:
2184 strcat (buf, ", LE8");
2185 break;
2186
2187 default:
2188 unknown = 1;
2189 break;
2190 }
2191 break;
2192 }
2193 break;
2194
2195 case EF_ARM_EABI_VER5:
2196 strcat (buf, ", Version5 EABI");
2197 while (e_flags)
2198 {
2199 unsigned flag;
2200
2201 /* Process flags one bit at a time. */
2202 flag = e_flags & - e_flags;
2203 e_flags &= ~ flag;
2204
2205 switch (flag)
2206 {
2207 case EF_ARM_BE8:
2208 strcat (buf, ", BE8");
2209 break;
2210
2211 case EF_ARM_LE8:
2212 strcat (buf, ", LE8");
2213 break;
2214
2215 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2216 strcat (buf, ", soft-float ABI");
2217 break;
2218
2219 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2220 strcat (buf, ", hard-float ABI");
2221 break;
2222
2223 default:
2224 unknown = 1;
2225 break;
2226 }
2227 }
2228 break;
2229
2230 case EF_ARM_EABI_UNKNOWN:
2231 strcat (buf, ", GNU EABI");
2232 while (e_flags)
2233 {
2234 unsigned flag;
2235
2236 /* Process flags one bit at a time. */
2237 flag = e_flags & - e_flags;
2238 e_flags &= ~ flag;
2239
2240 switch (flag)
2241 {
2242 case EF_ARM_INTERWORK:
2243 strcat (buf, ", interworking enabled");
2244 break;
2245
2246 case EF_ARM_APCS_26:
2247 strcat (buf, ", uses APCS/26");
2248 break;
2249
2250 case EF_ARM_APCS_FLOAT:
2251 strcat (buf, ", uses APCS/float");
2252 break;
2253
2254 case EF_ARM_PIC:
2255 strcat (buf, ", position independent");
2256 break;
2257
2258 case EF_ARM_ALIGN8:
2259 strcat (buf, ", 8 bit structure alignment");
2260 break;
2261
2262 case EF_ARM_NEW_ABI:
2263 strcat (buf, ", uses new ABI");
2264 break;
2265
2266 case EF_ARM_OLD_ABI:
2267 strcat (buf, ", uses old ABI");
2268 break;
2269
2270 case EF_ARM_SOFT_FLOAT:
2271 strcat (buf, ", software FP");
2272 break;
2273
2274 case EF_ARM_VFP_FLOAT:
2275 strcat (buf, ", VFP");
2276 break;
2277
2278 case EF_ARM_MAVERICK_FLOAT:
2279 strcat (buf, ", Maverick FP");
2280 break;
2281
2282 default:
2283 unknown = 1;
2284 break;
2285 }
2286 }
2287 }
2288
2289 if (unknown)
2290 strcat (buf,_(", <unknown>"));
2291 }
2292
2293 static char *
2294 get_machine_flags (unsigned e_flags, unsigned e_machine)
2295 {
2296 static char buf[1024];
2297
2298 buf[0] = '\0';
2299
2300 if (e_flags)
2301 {
2302 switch (e_machine)
2303 {
2304 default:
2305 break;
2306
2307 case EM_ARM:
2308 decode_ARM_machine_flags (e_flags, buf);
2309 break;
2310
2311 case EM_BLACKFIN:
2312 if (e_flags & EF_BFIN_PIC)
2313 strcat (buf, ", PIC");
2314
2315 if (e_flags & EF_BFIN_FDPIC)
2316 strcat (buf, ", FDPIC");
2317
2318 if (e_flags & EF_BFIN_CODE_IN_L1)
2319 strcat (buf, ", code in L1");
2320
2321 if (e_flags & EF_BFIN_DATA_IN_L1)
2322 strcat (buf, ", data in L1");
2323
2324 break;
2325
2326 case EM_CYGNUS_FRV:
2327 switch (e_flags & EF_FRV_CPU_MASK)
2328 {
2329 case EF_FRV_CPU_GENERIC:
2330 break;
2331
2332 default:
2333 strcat (buf, ", fr???");
2334 break;
2335
2336 case EF_FRV_CPU_FR300:
2337 strcat (buf, ", fr300");
2338 break;
2339
2340 case EF_FRV_CPU_FR400:
2341 strcat (buf, ", fr400");
2342 break;
2343 case EF_FRV_CPU_FR405:
2344 strcat (buf, ", fr405");
2345 break;
2346
2347 case EF_FRV_CPU_FR450:
2348 strcat (buf, ", fr450");
2349 break;
2350
2351 case EF_FRV_CPU_FR500:
2352 strcat (buf, ", fr500");
2353 break;
2354 case EF_FRV_CPU_FR550:
2355 strcat (buf, ", fr550");
2356 break;
2357
2358 case EF_FRV_CPU_SIMPLE:
2359 strcat (buf, ", simple");
2360 break;
2361 case EF_FRV_CPU_TOMCAT:
2362 strcat (buf, ", tomcat");
2363 break;
2364 }
2365 break;
2366
2367 case EM_68K:
2368 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2369 strcat (buf, ", m68000");
2370 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2371 strcat (buf, ", cpu32");
2372 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2373 strcat (buf, ", fido_a");
2374 else
2375 {
2376 char const * isa = _("unknown");
2377 char const * mac = _("unknown mac");
2378 char const * additional = NULL;
2379
2380 switch (e_flags & EF_M68K_CF_ISA_MASK)
2381 {
2382 case EF_M68K_CF_ISA_A_NODIV:
2383 isa = "A";
2384 additional = ", nodiv";
2385 break;
2386 case EF_M68K_CF_ISA_A:
2387 isa = "A";
2388 break;
2389 case EF_M68K_CF_ISA_A_PLUS:
2390 isa = "A+";
2391 break;
2392 case EF_M68K_CF_ISA_B_NOUSP:
2393 isa = "B";
2394 additional = ", nousp";
2395 break;
2396 case EF_M68K_CF_ISA_B:
2397 isa = "B";
2398 break;
2399 case EF_M68K_CF_ISA_C:
2400 isa = "C";
2401 break;
2402 case EF_M68K_CF_ISA_C_NODIV:
2403 isa = "C";
2404 additional = ", nodiv";
2405 break;
2406 }
2407 strcat (buf, ", cf, isa ");
2408 strcat (buf, isa);
2409 if (additional)
2410 strcat (buf, additional);
2411 if (e_flags & EF_M68K_CF_FLOAT)
2412 strcat (buf, ", float");
2413 switch (e_flags & EF_M68K_CF_MAC_MASK)
2414 {
2415 case 0:
2416 mac = NULL;
2417 break;
2418 case EF_M68K_CF_MAC:
2419 mac = "mac";
2420 break;
2421 case EF_M68K_CF_EMAC:
2422 mac = "emac";
2423 break;
2424 case EF_M68K_CF_EMAC_B:
2425 mac = "emac_b";
2426 break;
2427 }
2428 if (mac)
2429 {
2430 strcat (buf, ", ");
2431 strcat (buf, mac);
2432 }
2433 }
2434 break;
2435
2436 case EM_PPC:
2437 if (e_flags & EF_PPC_EMB)
2438 strcat (buf, ", emb");
2439
2440 if (e_flags & EF_PPC_RELOCATABLE)
2441 strcat (buf, _(", relocatable"));
2442
2443 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2444 strcat (buf, _(", relocatable-lib"));
2445 break;
2446
2447 case EM_V800:
2448 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2449 strcat (buf, ", RH850 ABI");
2450
2451 if (e_flags & EF_V800_850E3)
2452 strcat (buf, ", V3 architecture");
2453
2454 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2455 strcat (buf, ", FPU not used");
2456
2457 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2458 strcat (buf, ", regmode: COMMON");
2459
2460 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2461 strcat (buf, ", r4 not used");
2462
2463 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2464 strcat (buf, ", r30 not used");
2465
2466 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2467 strcat (buf, ", r5 not used");
2468
2469 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2470 strcat (buf, ", r2 not used");
2471
2472 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2473 {
2474 switch (e_flags & - e_flags)
2475 {
2476 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2477 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2478 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2479 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2480 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2481 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2482 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2483 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2484 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2485 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2486 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2487 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2488 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2489 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2490 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2491 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2492 default: break;
2493 }
2494 }
2495 break;
2496
2497 case EM_V850:
2498 case EM_CYGNUS_V850:
2499 switch (e_flags & EF_V850_ARCH)
2500 {
2501 case E_V850E3V5_ARCH:
2502 strcat (buf, ", v850e3v5");
2503 break;
2504 case E_V850E2V3_ARCH:
2505 strcat (buf, ", v850e2v3");
2506 break;
2507 case E_V850E2_ARCH:
2508 strcat (buf, ", v850e2");
2509 break;
2510 case E_V850E1_ARCH:
2511 strcat (buf, ", v850e1");
2512 break;
2513 case E_V850E_ARCH:
2514 strcat (buf, ", v850e");
2515 break;
2516 case E_V850_ARCH:
2517 strcat (buf, ", v850");
2518 break;
2519 default:
2520 strcat (buf, _(", unknown v850 architecture variant"));
2521 break;
2522 }
2523 break;
2524
2525 case EM_M32R:
2526 case EM_CYGNUS_M32R:
2527 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2528 strcat (buf, ", m32r");
2529 break;
2530
2531 case EM_MIPS:
2532 case EM_MIPS_RS3_LE:
2533 if (e_flags & EF_MIPS_NOREORDER)
2534 strcat (buf, ", noreorder");
2535
2536 if (e_flags & EF_MIPS_PIC)
2537 strcat (buf, ", pic");
2538
2539 if (e_flags & EF_MIPS_CPIC)
2540 strcat (buf, ", cpic");
2541
2542 if (e_flags & EF_MIPS_UCODE)
2543 strcat (buf, ", ugen_reserved");
2544
2545 if (e_flags & EF_MIPS_ABI2)
2546 strcat (buf, ", abi2");
2547
2548 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2549 strcat (buf, ", odk first");
2550
2551 if (e_flags & EF_MIPS_32BITMODE)
2552 strcat (buf, ", 32bitmode");
2553
2554 switch ((e_flags & EF_MIPS_MACH))
2555 {
2556 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2557 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2558 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2559 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2560 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2561 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2562 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2563 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2564 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2565 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2566 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2567 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2568 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2569 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2570 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2571 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2572 case 0:
2573 /* We simply ignore the field in this case to avoid confusion:
2574 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2575 extension. */
2576 break;
2577 default: strcat (buf, _(", unknown CPU")); break;
2578 }
2579
2580 switch ((e_flags & EF_MIPS_ABI))
2581 {
2582 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2583 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2584 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2585 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2586 case 0:
2587 /* We simply ignore the field in this case to avoid confusion:
2588 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2589 This means it is likely to be an o32 file, but not for
2590 sure. */
2591 break;
2592 default: strcat (buf, _(", unknown ABI")); break;
2593 }
2594
2595 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2596 strcat (buf, ", mdmx");
2597
2598 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2599 strcat (buf, ", mips16");
2600
2601 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2602 strcat (buf, ", micromips");
2603
2604 switch ((e_flags & EF_MIPS_ARCH))
2605 {
2606 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2607 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2608 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2609 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2610 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2611 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2612 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2613 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2614 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2615 default: strcat (buf, _(", unknown ISA")); break;
2616 }
2617 break;
2618
2619 case EM_SH:
2620 switch ((e_flags & EF_SH_MACH_MASK))
2621 {
2622 case EF_SH1: strcat (buf, ", sh1"); break;
2623 case EF_SH2: strcat (buf, ", sh2"); break;
2624 case EF_SH3: strcat (buf, ", sh3"); break;
2625 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2626 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2627 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2628 case EF_SH3E: strcat (buf, ", sh3e"); break;
2629 case EF_SH4: strcat (buf, ", sh4"); break;
2630 case EF_SH5: strcat (buf, ", sh5"); break;
2631 case EF_SH2E: strcat (buf, ", sh2e"); break;
2632 case EF_SH4A: strcat (buf, ", sh4a"); break;
2633 case EF_SH2A: strcat (buf, ", sh2a"); break;
2634 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2635 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2636 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2637 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2638 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2639 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2640 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2641 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2642 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2643 default: strcat (buf, _(", unknown ISA")); break;
2644 }
2645
2646 if (e_flags & EF_SH_PIC)
2647 strcat (buf, ", pic");
2648
2649 if (e_flags & EF_SH_FDPIC)
2650 strcat (buf, ", fdpic");
2651 break;
2652
2653 case EM_SPARCV9:
2654 if (e_flags & EF_SPARC_32PLUS)
2655 strcat (buf, ", v8+");
2656
2657 if (e_flags & EF_SPARC_SUN_US1)
2658 strcat (buf, ", ultrasparcI");
2659
2660 if (e_flags & EF_SPARC_SUN_US3)
2661 strcat (buf, ", ultrasparcIII");
2662
2663 if (e_flags & EF_SPARC_HAL_R1)
2664 strcat (buf, ", halr1");
2665
2666 if (e_flags & EF_SPARC_LEDATA)
2667 strcat (buf, ", ledata");
2668
2669 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2670 strcat (buf, ", tso");
2671
2672 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2673 strcat (buf, ", pso");
2674
2675 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2676 strcat (buf, ", rmo");
2677 break;
2678
2679 case EM_PARISC:
2680 switch (e_flags & EF_PARISC_ARCH)
2681 {
2682 case EFA_PARISC_1_0:
2683 strcpy (buf, ", PA-RISC 1.0");
2684 break;
2685 case EFA_PARISC_1_1:
2686 strcpy (buf, ", PA-RISC 1.1");
2687 break;
2688 case EFA_PARISC_2_0:
2689 strcpy (buf, ", PA-RISC 2.0");
2690 break;
2691 default:
2692 break;
2693 }
2694 if (e_flags & EF_PARISC_TRAPNIL)
2695 strcat (buf, ", trapnil");
2696 if (e_flags & EF_PARISC_EXT)
2697 strcat (buf, ", ext");
2698 if (e_flags & EF_PARISC_LSB)
2699 strcat (buf, ", lsb");
2700 if (e_flags & EF_PARISC_WIDE)
2701 strcat (buf, ", wide");
2702 if (e_flags & EF_PARISC_NO_KABP)
2703 strcat (buf, ", no kabp");
2704 if (e_flags & EF_PARISC_LAZYSWAP)
2705 strcat (buf, ", lazyswap");
2706 break;
2707
2708 case EM_PJ:
2709 case EM_PJ_OLD:
2710 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2711 strcat (buf, ", new calling convention");
2712
2713 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2714 strcat (buf, ", gnu calling convention");
2715 break;
2716
2717 case EM_IA_64:
2718 if ((e_flags & EF_IA_64_ABI64))
2719 strcat (buf, ", 64-bit");
2720 else
2721 strcat (buf, ", 32-bit");
2722 if ((e_flags & EF_IA_64_REDUCEDFP))
2723 strcat (buf, ", reduced fp model");
2724 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2725 strcat (buf, ", no function descriptors, constant gp");
2726 else if ((e_flags & EF_IA_64_CONS_GP))
2727 strcat (buf, ", constant gp");
2728 if ((e_flags & EF_IA_64_ABSOLUTE))
2729 strcat (buf, ", absolute");
2730 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2731 {
2732 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2733 strcat (buf, ", vms_linkages");
2734 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2735 {
2736 case EF_IA_64_VMS_COMCOD_SUCCESS:
2737 break;
2738 case EF_IA_64_VMS_COMCOD_WARNING:
2739 strcat (buf, ", warning");
2740 break;
2741 case EF_IA_64_VMS_COMCOD_ERROR:
2742 strcat (buf, ", error");
2743 break;
2744 case EF_IA_64_VMS_COMCOD_ABORT:
2745 strcat (buf, ", abort");
2746 break;
2747 default:
2748 abort ();
2749 }
2750 }
2751 break;
2752
2753 case EM_VAX:
2754 if ((e_flags & EF_VAX_NONPIC))
2755 strcat (buf, ", non-PIC");
2756 if ((e_flags & EF_VAX_DFLOAT))
2757 strcat (buf, ", D-Float");
2758 if ((e_flags & EF_VAX_GFLOAT))
2759 strcat (buf, ", G-Float");
2760 break;
2761
2762 case EM_RX:
2763 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2764 strcat (buf, ", 64-bit doubles");
2765 if (e_flags & E_FLAG_RX_DSP)
2766 strcat (buf, ", dsp");
2767 if (e_flags & E_FLAG_RX_PID)
2768 strcat (buf, ", pid");
2769 if (e_flags & E_FLAG_RX_ABI)
2770 strcat (buf, ", RX ABI");
2771 break;
2772
2773 case EM_S390:
2774 if (e_flags & EF_S390_HIGH_GPRS)
2775 strcat (buf, ", highgprs");
2776 break;
2777
2778 case EM_TI_C6000:
2779 if ((e_flags & EF_C6000_REL))
2780 strcat (buf, ", relocatable module");
2781 break;
2782 }
2783 }
2784
2785 return buf;
2786 }
2787
2788 static const char *
2789 get_osabi_name (unsigned int osabi)
2790 {
2791 static char buff[32];
2792
2793 switch (osabi)
2794 {
2795 case ELFOSABI_NONE: return "UNIX - System V";
2796 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2797 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2798 case ELFOSABI_GNU: return "UNIX - GNU";
2799 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2800 case ELFOSABI_AIX: return "UNIX - AIX";
2801 case ELFOSABI_IRIX: return "UNIX - IRIX";
2802 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2803 case ELFOSABI_TRU64: return "UNIX - TRU64";
2804 case ELFOSABI_MODESTO: return "Novell - Modesto";
2805 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2806 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2807 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2808 case ELFOSABI_AROS: return "AROS";
2809 case ELFOSABI_FENIXOS: return "FenixOS";
2810 default:
2811 if (osabi >= 64)
2812 switch (elf_header.e_machine)
2813 {
2814 case EM_ARM:
2815 switch (osabi)
2816 {
2817 case ELFOSABI_ARM: return "ARM";
2818 default:
2819 break;
2820 }
2821 break;
2822
2823 case EM_MSP430:
2824 case EM_MSP430_OLD:
2825 switch (osabi)
2826 {
2827 case ELFOSABI_STANDALONE: return _("Standalone App");
2828 default:
2829 break;
2830 }
2831 break;
2832
2833 case EM_TI_C6000:
2834 switch (osabi)
2835 {
2836 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2837 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2838 default:
2839 break;
2840 }
2841 break;
2842
2843 default:
2844 break;
2845 }
2846 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2847 return buff;
2848 }
2849 }
2850
2851 static const char *
2852 get_aarch64_segment_type (unsigned long type)
2853 {
2854 switch (type)
2855 {
2856 case PT_AARCH64_ARCHEXT:
2857 return "AARCH64_ARCHEXT";
2858 default:
2859 break;
2860 }
2861
2862 return NULL;
2863 }
2864
2865 static const char *
2866 get_arm_segment_type (unsigned long type)
2867 {
2868 switch (type)
2869 {
2870 case PT_ARM_EXIDX:
2871 return "EXIDX";
2872 default:
2873 break;
2874 }
2875
2876 return NULL;
2877 }
2878
2879 static const char *
2880 get_mips_segment_type (unsigned long type)
2881 {
2882 switch (type)
2883 {
2884 case PT_MIPS_REGINFO:
2885 return "REGINFO";
2886 case PT_MIPS_RTPROC:
2887 return "RTPROC";
2888 case PT_MIPS_OPTIONS:
2889 return "OPTIONS";
2890 default:
2891 break;
2892 }
2893
2894 return NULL;
2895 }
2896
2897 static const char *
2898 get_parisc_segment_type (unsigned long type)
2899 {
2900 switch (type)
2901 {
2902 case PT_HP_TLS: return "HP_TLS";
2903 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2904 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2905 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2906 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2907 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2908 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2909 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2910 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2911 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2912 case PT_HP_PARALLEL: return "HP_PARALLEL";
2913 case PT_HP_FASTBIND: return "HP_FASTBIND";
2914 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2915 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2916 case PT_HP_STACK: return "HP_STACK";
2917 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2918 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2919 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2920 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2921 default:
2922 break;
2923 }
2924
2925 return NULL;
2926 }
2927
2928 static const char *
2929 get_ia64_segment_type (unsigned long type)
2930 {
2931 switch (type)
2932 {
2933 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2934 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2935 case PT_HP_TLS: return "HP_TLS";
2936 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2937 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2938 case PT_IA_64_HP_STACK: return "HP_STACK";
2939 default:
2940 break;
2941 }
2942
2943 return NULL;
2944 }
2945
2946 static const char *
2947 get_tic6x_segment_type (unsigned long type)
2948 {
2949 switch (type)
2950 {
2951 case PT_C6000_PHATTR: return "C6000_PHATTR";
2952 default:
2953 break;
2954 }
2955
2956 return NULL;
2957 }
2958
2959 static const char *
2960 get_segment_type (unsigned long p_type)
2961 {
2962 static char buff[32];
2963
2964 switch (p_type)
2965 {
2966 case PT_NULL: return "NULL";
2967 case PT_LOAD: return "LOAD";
2968 case PT_DYNAMIC: return "DYNAMIC";
2969 case PT_INTERP: return "INTERP";
2970 case PT_NOTE: return "NOTE";
2971 case PT_SHLIB: return "SHLIB";
2972 case PT_PHDR: return "PHDR";
2973 case PT_TLS: return "TLS";
2974
2975 case PT_GNU_EH_FRAME:
2976 return "GNU_EH_FRAME";
2977 case PT_GNU_STACK: return "GNU_STACK";
2978 case PT_GNU_RELRO: return "GNU_RELRO";
2979
2980 default:
2981 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2982 {
2983 const char * result;
2984
2985 switch (elf_header.e_machine)
2986 {
2987 case EM_AARCH64:
2988 result = get_aarch64_segment_type (p_type);
2989 break;
2990 case EM_ARM:
2991 result = get_arm_segment_type (p_type);
2992 break;
2993 case EM_MIPS:
2994 case EM_MIPS_RS3_LE:
2995 result = get_mips_segment_type (p_type);
2996 break;
2997 case EM_PARISC:
2998 result = get_parisc_segment_type (p_type);
2999 break;
3000 case EM_IA_64:
3001 result = get_ia64_segment_type (p_type);
3002 break;
3003 case EM_TI_C6000:
3004 result = get_tic6x_segment_type (p_type);
3005 break;
3006 default:
3007 result = NULL;
3008 break;
3009 }
3010
3011 if (result != NULL)
3012 return result;
3013
3014 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3015 }
3016 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3017 {
3018 const char * result;
3019
3020 switch (elf_header.e_machine)
3021 {
3022 case EM_PARISC:
3023 result = get_parisc_segment_type (p_type);
3024 break;
3025 case EM_IA_64:
3026 result = get_ia64_segment_type (p_type);
3027 break;
3028 default:
3029 result = NULL;
3030 break;
3031 }
3032
3033 if (result != NULL)
3034 return result;
3035
3036 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3037 }
3038 else
3039 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3040
3041 return buff;
3042 }
3043 }
3044
3045 static const char *
3046 get_mips_section_type_name (unsigned int sh_type)
3047 {
3048 switch (sh_type)
3049 {
3050 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3051 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3052 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3053 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3054 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3055 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3056 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3057 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3058 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3059 case SHT_MIPS_RELD: return "MIPS_RELD";
3060 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3061 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3062 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3063 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3064 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3065 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3066 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3067 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3068 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3069 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3070 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3071 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3072 case SHT_MIPS_LINE: return "MIPS_LINE";
3073 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3074 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3075 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3076 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3077 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3078 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3079 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3080 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3081 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3082 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3083 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3084 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3085 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3086 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3087 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3088 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3089 default:
3090 break;
3091 }
3092 return NULL;
3093 }
3094
3095 static const char *
3096 get_parisc_section_type_name (unsigned int sh_type)
3097 {
3098 switch (sh_type)
3099 {
3100 case SHT_PARISC_EXT: return "PARISC_EXT";
3101 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3102 case SHT_PARISC_DOC: return "PARISC_DOC";
3103 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3104 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3105 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3106 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3107 default:
3108 break;
3109 }
3110 return NULL;
3111 }
3112
3113 static const char *
3114 get_ia64_section_type_name (unsigned int sh_type)
3115 {
3116 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3117 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3118 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3119
3120 switch (sh_type)
3121 {
3122 case SHT_IA_64_EXT: return "IA_64_EXT";
3123 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3124 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3125 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3126 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3127 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3128 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3129 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3130 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3131 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3132 default:
3133 break;
3134 }
3135 return NULL;
3136 }
3137
3138 static const char *
3139 get_x86_64_section_type_name (unsigned int sh_type)
3140 {
3141 switch (sh_type)
3142 {
3143 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3144 default:
3145 break;
3146 }
3147 return NULL;
3148 }
3149
3150 static const char *
3151 get_aarch64_section_type_name (unsigned int sh_type)
3152 {
3153 switch (sh_type)
3154 {
3155 case SHT_AARCH64_ATTRIBUTES:
3156 return "AARCH64_ATTRIBUTES";
3157 default:
3158 break;
3159 }
3160 return NULL;
3161 }
3162
3163 static const char *
3164 get_arm_section_type_name (unsigned int sh_type)
3165 {
3166 switch (sh_type)
3167 {
3168 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3169 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3170 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3171 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3172 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3173 default:
3174 break;
3175 }
3176 return NULL;
3177 }
3178
3179 static const char *
3180 get_tic6x_section_type_name (unsigned int sh_type)
3181 {
3182 switch (sh_type)
3183 {
3184 case SHT_C6000_UNWIND:
3185 return "C6000_UNWIND";
3186 case SHT_C6000_PREEMPTMAP:
3187 return "C6000_PREEMPTMAP";
3188 case SHT_C6000_ATTRIBUTES:
3189 return "C6000_ATTRIBUTES";
3190 case SHT_TI_ICODE:
3191 return "TI_ICODE";
3192 case SHT_TI_XREF:
3193 return "TI_XREF";
3194 case SHT_TI_HANDLER:
3195 return "TI_HANDLER";
3196 case SHT_TI_INITINFO:
3197 return "TI_INITINFO";
3198 case SHT_TI_PHATTRS:
3199 return "TI_PHATTRS";
3200 default:
3201 break;
3202 }
3203 return NULL;
3204 }
3205
3206 static const char *
3207 get_section_type_name (unsigned int sh_type)
3208 {
3209 static char buff[32];
3210
3211 switch (sh_type)
3212 {
3213 case SHT_NULL: return "NULL";
3214 case SHT_PROGBITS: return "PROGBITS";
3215 case SHT_SYMTAB: return "SYMTAB";
3216 case SHT_STRTAB: return "STRTAB";
3217 case SHT_RELA: return "RELA";
3218 case SHT_HASH: return "HASH";
3219 case SHT_DYNAMIC: return "DYNAMIC";
3220 case SHT_NOTE: return "NOTE";
3221 case SHT_NOBITS: return "NOBITS";
3222 case SHT_REL: return "REL";
3223 case SHT_SHLIB: return "SHLIB";
3224 case SHT_DYNSYM: return "DYNSYM";
3225 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3226 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3227 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3228 case SHT_GNU_HASH: return "GNU_HASH";
3229 case SHT_GROUP: return "GROUP";
3230 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3231 case SHT_GNU_verdef: return "VERDEF";
3232 case SHT_GNU_verneed: return "VERNEED";
3233 case SHT_GNU_versym: return "VERSYM";
3234 case 0x6ffffff0: return "VERSYM";
3235 case 0x6ffffffc: return "VERDEF";
3236 case 0x7ffffffd: return "AUXILIARY";
3237 case 0x7fffffff: return "FILTER";
3238 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3239
3240 default:
3241 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3242 {
3243 const char * result;
3244
3245 switch (elf_header.e_machine)
3246 {
3247 case EM_MIPS:
3248 case EM_MIPS_RS3_LE:
3249 result = get_mips_section_type_name (sh_type);
3250 break;
3251 case EM_PARISC:
3252 result = get_parisc_section_type_name (sh_type);
3253 break;
3254 case EM_IA_64:
3255 result = get_ia64_section_type_name (sh_type);
3256 break;
3257 case EM_X86_64:
3258 case EM_L1OM:
3259 case EM_K1OM:
3260 result = get_x86_64_section_type_name (sh_type);
3261 break;
3262 case EM_AARCH64:
3263 result = get_aarch64_section_type_name (sh_type);
3264 break;
3265 case EM_ARM:
3266 result = get_arm_section_type_name (sh_type);
3267 break;
3268 case EM_TI_C6000:
3269 result = get_tic6x_section_type_name (sh_type);
3270 break;
3271 default:
3272 result = NULL;
3273 break;
3274 }
3275
3276 if (result != NULL)
3277 return result;
3278
3279 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3280 }
3281 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3282 {
3283 const char * result;
3284
3285 switch (elf_header.e_machine)
3286 {
3287 case EM_IA_64:
3288 result = get_ia64_section_type_name (sh_type);
3289 break;
3290 default:
3291 result = NULL;
3292 break;
3293 }
3294
3295 if (result != NULL)
3296 return result;
3297
3298 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3299 }
3300 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3301 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3302 else
3303 /* This message is probably going to be displayed in a 15
3304 character wide field, so put the hex value first. */
3305 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3306
3307 return buff;
3308 }
3309 }
3310
3311 #define OPTION_DEBUG_DUMP 512
3312 #define OPTION_DYN_SYMS 513
3313 #define OPTION_DWARF_DEPTH 514
3314 #define OPTION_DWARF_START 515
3315 #define OPTION_DWARF_CHECK 516
3316
3317 static struct option options[] =
3318 {
3319 {"all", no_argument, 0, 'a'},
3320 {"file-header", no_argument, 0, 'h'},
3321 {"program-headers", no_argument, 0, 'l'},
3322 {"headers", no_argument, 0, 'e'},
3323 {"histogram", no_argument, 0, 'I'},
3324 {"segments", no_argument, 0, 'l'},
3325 {"sections", no_argument, 0, 'S'},
3326 {"section-headers", no_argument, 0, 'S'},
3327 {"section-groups", no_argument, 0, 'g'},
3328 {"section-details", no_argument, 0, 't'},
3329 {"full-section-name",no_argument, 0, 'N'},
3330 {"symbols", no_argument, 0, 's'},
3331 {"syms", no_argument, 0, 's'},
3332 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3333 {"relocs", no_argument, 0, 'r'},
3334 {"notes", no_argument, 0, 'n'},
3335 {"dynamic", no_argument, 0, 'd'},
3336 {"arch-specific", no_argument, 0, 'A'},
3337 {"version-info", no_argument, 0, 'V'},
3338 {"use-dynamic", no_argument, 0, 'D'},
3339 {"unwind", no_argument, 0, 'u'},
3340 {"archive-index", no_argument, 0, 'c'},
3341 {"hex-dump", required_argument, 0, 'x'},
3342 {"relocated-dump", required_argument, 0, 'R'},
3343 {"string-dump", required_argument, 0, 'p'},
3344 #ifdef SUPPORT_DISASSEMBLY
3345 {"instruction-dump", required_argument, 0, 'i'},
3346 #endif
3347 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3348
3349 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3350 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3351 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3352
3353 {"version", no_argument, 0, 'v'},
3354 {"wide", no_argument, 0, 'W'},
3355 {"help", no_argument, 0, 'H'},
3356 {0, no_argument, 0, 0}
3357 };
3358
3359 static void
3360 usage (FILE * stream)
3361 {
3362 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3363 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3364 fprintf (stream, _(" Options are:\n\
3365 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3366 -h --file-header Display the ELF file header\n\
3367 -l --program-headers Display the program headers\n\
3368 --segments An alias for --program-headers\n\
3369 -S --section-headers Display the sections' header\n\
3370 --sections An alias for --section-headers\n\
3371 -g --section-groups Display the section groups\n\
3372 -t --section-details Display the section details\n\
3373 -e --headers Equivalent to: -h -l -S\n\
3374 -s --syms Display the symbol table\n\
3375 --symbols An alias for --syms\n\
3376 --dyn-syms Display the dynamic symbol table\n\
3377 -n --notes Display the core notes (if present)\n\
3378 -r --relocs Display the relocations (if present)\n\
3379 -u --unwind Display the unwind info (if present)\n\
3380 -d --dynamic Display the dynamic section (if present)\n\
3381 -V --version-info Display the version sections (if present)\n\
3382 -A --arch-specific Display architecture specific information (if any)\n\
3383 -c --archive-index Display the symbol/file index in an archive\n\
3384 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3385 -x --hex-dump=<number|name>\n\
3386 Dump the contents of section <number|name> as bytes\n\
3387 -p --string-dump=<number|name>\n\
3388 Dump the contents of section <number|name> as strings\n\
3389 -R --relocated-dump=<number|name>\n\
3390 Dump the contents of section <number|name> as relocated bytes\n\
3391 -w[lLiaprmfFsoRt] or\n\
3392 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3393 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3394 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3395 =addr,=cu_index]\n\
3396 Display the contents of DWARF2 debug sections\n"));
3397 fprintf (stream, _("\
3398 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3399 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3400 or deeper\n"));
3401 #ifdef SUPPORT_DISASSEMBLY
3402 fprintf (stream, _("\
3403 -i --instruction-dump=<number|name>\n\
3404 Disassemble the contents of section <number|name>\n"));
3405 #endif
3406 fprintf (stream, _("\
3407 -I --histogram Display histogram of bucket list lengths\n\
3408 -W --wide Allow output width to exceed 80 characters\n\
3409 @<file> Read options from <file>\n\
3410 -H --help Display this information\n\
3411 -v --version Display the version number of readelf\n"));
3412
3413 if (REPORT_BUGS_TO[0] && stream == stdout)
3414 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3415
3416 exit (stream == stdout ? 0 : 1);
3417 }
3418
3419 /* Record the fact that the user wants the contents of section number
3420 SECTION to be displayed using the method(s) encoded as flags bits
3421 in TYPE. Note, TYPE can be zero if we are creating the array for
3422 the first time. */
3423
3424 static void
3425 request_dump_bynumber (unsigned int section, dump_type type)
3426 {
3427 if (section >= num_dump_sects)
3428 {
3429 dump_type * new_dump_sects;
3430
3431 new_dump_sects = (dump_type *) calloc (section + 1,
3432 sizeof (* dump_sects));
3433
3434 if (new_dump_sects == NULL)
3435 error (_("Out of memory allocating dump request table.\n"));
3436 else
3437 {
3438 /* Copy current flag settings. */
3439 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3440
3441 free (dump_sects);
3442
3443 dump_sects = new_dump_sects;
3444 num_dump_sects = section + 1;
3445 }
3446 }
3447
3448 if (dump_sects)
3449 dump_sects[section] |= type;
3450
3451 return;
3452 }
3453
3454 /* Request a dump by section name. */
3455
3456 static void
3457 request_dump_byname (const char * section, dump_type type)
3458 {
3459 struct dump_list_entry * new_request;
3460
3461 new_request = (struct dump_list_entry *)
3462 malloc (sizeof (struct dump_list_entry));
3463 if (!new_request)
3464 error (_("Out of memory allocating dump request table.\n"));
3465
3466 new_request->name = strdup (section);
3467 if (!new_request->name)
3468 error (_("Out of memory allocating dump request table.\n"));
3469
3470 new_request->type = type;
3471
3472 new_request->next = dump_sects_byname;
3473 dump_sects_byname = new_request;
3474 }
3475
3476 static inline void
3477 request_dump (dump_type type)
3478 {
3479 int section;
3480 char * cp;
3481
3482 do_dump++;
3483 section = strtoul (optarg, & cp, 0);
3484
3485 if (! *cp && section >= 0)
3486 request_dump_bynumber (section, type);
3487 else
3488 request_dump_byname (optarg, type);
3489 }
3490
3491
3492 static void
3493 parse_args (int argc, char ** argv)
3494 {
3495 int c;
3496
3497 if (argc < 2)
3498 usage (stderr);
3499
3500 while ((c = getopt_long
3501 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3502 {
3503 switch (c)
3504 {
3505 case 0:
3506 /* Long options. */
3507 break;
3508 case 'H':
3509 usage (stdout);
3510 break;
3511
3512 case 'a':
3513 do_syms++;
3514 do_reloc++;
3515 do_unwind++;
3516 do_dynamic++;
3517 do_header++;
3518 do_sections++;
3519 do_section_groups++;
3520 do_segments++;
3521 do_version++;
3522 do_histogram++;
3523 do_arch++;
3524 do_notes++;
3525 break;
3526 case 'g':
3527 do_section_groups++;
3528 break;
3529 case 't':
3530 case 'N':
3531 do_sections++;
3532 do_section_details++;
3533 break;
3534 case 'e':
3535 do_header++;
3536 do_sections++;
3537 do_segments++;
3538 break;
3539 case 'A':
3540 do_arch++;
3541 break;
3542 case 'D':
3543 do_using_dynamic++;
3544 break;
3545 case 'r':
3546 do_reloc++;
3547 break;
3548 case 'u':
3549 do_unwind++;
3550 break;
3551 case 'h':
3552 do_header++;
3553 break;
3554 case 'l':
3555 do_segments++;
3556 break;
3557 case 's':
3558 do_syms++;
3559 break;
3560 case 'S':
3561 do_sections++;
3562 break;
3563 case 'd':
3564 do_dynamic++;
3565 break;
3566 case 'I':
3567 do_histogram++;
3568 break;
3569 case 'n':
3570 do_notes++;
3571 break;
3572 case 'c':
3573 do_archive_index++;
3574 break;
3575 case 'x':
3576 request_dump (HEX_DUMP);
3577 break;
3578 case 'p':
3579 request_dump (STRING_DUMP);
3580 break;
3581 case 'R':
3582 request_dump (RELOC_DUMP);
3583 break;
3584 case 'w':
3585 do_dump++;
3586 if (optarg == 0)
3587 {
3588 do_debugging = 1;
3589 dwarf_select_sections_all ();
3590 }
3591 else
3592 {
3593 do_debugging = 0;
3594 dwarf_select_sections_by_letters (optarg);
3595 }
3596 break;
3597 case OPTION_DEBUG_DUMP:
3598 do_dump++;
3599 if (optarg == 0)
3600 do_debugging = 1;
3601 else
3602 {
3603 do_debugging = 0;
3604 dwarf_select_sections_by_names (optarg);
3605 }
3606 break;
3607 case OPTION_DWARF_DEPTH:
3608 {
3609 char *cp;
3610
3611 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3612 }
3613 break;
3614 case OPTION_DWARF_START:
3615 {
3616 char *cp;
3617
3618 dwarf_start_die = strtoul (optarg, & cp, 0);
3619 }
3620 break;
3621 case OPTION_DWARF_CHECK:
3622 dwarf_check = 1;
3623 break;
3624 case OPTION_DYN_SYMS:
3625 do_dyn_syms++;
3626 break;
3627 #ifdef SUPPORT_DISASSEMBLY
3628 case 'i':
3629 request_dump (DISASS_DUMP);
3630 break;
3631 #endif
3632 case 'v':
3633 print_version (program_name);
3634 break;
3635 case 'V':
3636 do_version++;
3637 break;
3638 case 'W':
3639 do_wide++;
3640 break;
3641 default:
3642 /* xgettext:c-format */
3643 error (_("Invalid option '-%c'\n"), c);
3644 /* Drop through. */
3645 case '?':
3646 usage (stderr);
3647 }
3648 }
3649
3650 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3651 && !do_segments && !do_header && !do_dump && !do_version
3652 && !do_histogram && !do_debugging && !do_arch && !do_notes
3653 && !do_section_groups && !do_archive_index
3654 && !do_dyn_syms)
3655 usage (stderr);
3656 else if (argc < 3)
3657 {
3658 warn (_("Nothing to do.\n"));
3659 usage (stderr);
3660 }
3661 }
3662
3663 static const char *
3664 get_elf_class (unsigned int elf_class)
3665 {
3666 static char buff[32];
3667
3668 switch (elf_class)
3669 {
3670 case ELFCLASSNONE: return _("none");
3671 case ELFCLASS32: return "ELF32";
3672 case ELFCLASS64: return "ELF64";
3673 default:
3674 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3675 return buff;
3676 }
3677 }
3678
3679 static const char *
3680 get_data_encoding (unsigned int encoding)
3681 {
3682 static char buff[32];
3683
3684 switch (encoding)
3685 {
3686 case ELFDATANONE: return _("none");
3687 case ELFDATA2LSB: return _("2's complement, little endian");
3688 case ELFDATA2MSB: return _("2's complement, big endian");
3689 default:
3690 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3691 return buff;
3692 }
3693 }
3694
3695 /* Decode the data held in 'elf_header'. */
3696
3697 static int
3698 process_file_header (void)
3699 {
3700 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3701 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3702 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3703 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3704 {
3705 error
3706 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3707 return 0;
3708 }
3709
3710 init_dwarf_regnames (elf_header.e_machine);
3711
3712 if (do_header)
3713 {
3714 int i;
3715
3716 printf (_("ELF Header:\n"));
3717 printf (_(" Magic: "));
3718 for (i = 0; i < EI_NIDENT; i++)
3719 printf ("%2.2x ", elf_header.e_ident[i]);
3720 printf ("\n");
3721 printf (_(" Class: %s\n"),
3722 get_elf_class (elf_header.e_ident[EI_CLASS]));
3723 printf (_(" Data: %s\n"),
3724 get_data_encoding (elf_header.e_ident[EI_DATA]));
3725 printf (_(" Version: %d %s\n"),
3726 elf_header.e_ident[EI_VERSION],
3727 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3728 ? "(current)"
3729 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3730 ? _("<unknown: %lx>")
3731 : "")));
3732 printf (_(" OS/ABI: %s\n"),
3733 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3734 printf (_(" ABI Version: %d\n"),
3735 elf_header.e_ident[EI_ABIVERSION]);
3736 printf (_(" Type: %s\n"),
3737 get_file_type (elf_header.e_type));
3738 printf (_(" Machine: %s\n"),
3739 get_machine_name (elf_header.e_machine));
3740 printf (_(" Version: 0x%lx\n"),
3741 (unsigned long) elf_header.e_version);
3742
3743 printf (_(" Entry point address: "));
3744 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3745 printf (_("\n Start of program headers: "));
3746 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3747 printf (_(" (bytes into file)\n Start of section headers: "));
3748 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3749 printf (_(" (bytes into file)\n"));
3750
3751 printf (_(" Flags: 0x%lx%s\n"),
3752 (unsigned long) elf_header.e_flags,
3753 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3754 printf (_(" Size of this header: %ld (bytes)\n"),
3755 (long) elf_header.e_ehsize);
3756 printf (_(" Size of program headers: %ld (bytes)\n"),
3757 (long) elf_header.e_phentsize);
3758 printf (_(" Number of program headers: %ld"),
3759 (long) elf_header.e_phnum);
3760 if (section_headers != NULL
3761 && elf_header.e_phnum == PN_XNUM
3762 && section_headers[0].sh_info != 0)
3763 printf (" (%ld)", (long) section_headers[0].sh_info);
3764 putc ('\n', stdout);
3765 printf (_(" Size of section headers: %ld (bytes)\n"),
3766 (long) elf_header.e_shentsize);
3767 printf (_(" Number of section headers: %ld"),
3768 (long) elf_header.e_shnum);
3769 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3770 printf (" (%ld)", (long) section_headers[0].sh_size);
3771 putc ('\n', stdout);
3772 printf (_(" Section header string table index: %ld"),
3773 (long) elf_header.e_shstrndx);
3774 if (section_headers != NULL
3775 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3776 printf (" (%u)", section_headers[0].sh_link);
3777 else if (elf_header.e_shstrndx != SHN_UNDEF
3778 && elf_header.e_shstrndx >= elf_header.e_shnum)
3779 printf (_(" <corrupt: out of range>"));
3780 putc ('\n', stdout);
3781 }
3782
3783 if (section_headers != NULL)
3784 {
3785 if (elf_header.e_phnum == PN_XNUM
3786 && section_headers[0].sh_info != 0)
3787 elf_header.e_phnum = section_headers[0].sh_info;
3788 if (elf_header.e_shnum == SHN_UNDEF)
3789 elf_header.e_shnum = section_headers[0].sh_size;
3790 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3791 elf_header.e_shstrndx = section_headers[0].sh_link;
3792 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3793 elf_header.e_shstrndx = SHN_UNDEF;
3794 free (section_headers);
3795 section_headers = NULL;
3796 }
3797
3798 return 1;
3799 }
3800
3801
3802 static int
3803 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3804 {
3805 Elf32_External_Phdr * phdrs;
3806 Elf32_External_Phdr * external;
3807 Elf_Internal_Phdr * internal;
3808 unsigned int i;
3809
3810 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3811 elf_header.e_phentsize,
3812 elf_header.e_phnum,
3813 _("program headers"));
3814 if (!phdrs)
3815 return 0;
3816
3817 for (i = 0, internal = pheaders, external = phdrs;
3818 i < elf_header.e_phnum;
3819 i++, internal++, external++)
3820 {
3821 internal->p_type = BYTE_GET (external->p_type);
3822 internal->p_offset = BYTE_GET (external->p_offset);
3823 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3824 internal->p_paddr = BYTE_GET (external->p_paddr);
3825 internal->p_filesz = BYTE_GET (external->p_filesz);
3826 internal->p_memsz = BYTE_GET (external->p_memsz);
3827 internal->p_flags = BYTE_GET (external->p_flags);
3828 internal->p_align = BYTE_GET (external->p_align);
3829 }
3830
3831 free (phdrs);
3832
3833 return 1;
3834 }
3835
3836 static int
3837 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3838 {
3839 Elf64_External_Phdr * phdrs;
3840 Elf64_External_Phdr * external;
3841 Elf_Internal_Phdr * internal;
3842 unsigned int i;
3843
3844 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3845 elf_header.e_phentsize,
3846 elf_header.e_phnum,
3847 _("program headers"));
3848 if (!phdrs)
3849 return 0;
3850
3851 for (i = 0, internal = pheaders, external = phdrs;
3852 i < elf_header.e_phnum;
3853 i++, internal++, external++)
3854 {
3855 internal->p_type = BYTE_GET (external->p_type);
3856 internal->p_flags = BYTE_GET (external->p_flags);
3857 internal->p_offset = BYTE_GET (external->p_offset);
3858 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3859 internal->p_paddr = BYTE_GET (external->p_paddr);
3860 internal->p_filesz = BYTE_GET (external->p_filesz);
3861 internal->p_memsz = BYTE_GET (external->p_memsz);
3862 internal->p_align = BYTE_GET (external->p_align);
3863 }
3864
3865 free (phdrs);
3866
3867 return 1;
3868 }
3869
3870 /* Returns 1 if the program headers were read into `program_headers'. */
3871
3872 static int
3873 get_program_headers (FILE * file)
3874 {
3875 Elf_Internal_Phdr * phdrs;
3876
3877 /* Check cache of prior read. */
3878 if (program_headers != NULL)
3879 return 1;
3880
3881 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3882 sizeof (Elf_Internal_Phdr));
3883
3884 if (phdrs == NULL)
3885 {
3886 error (_("Out of memory\n"));
3887 return 0;
3888 }
3889
3890 if (is_32bit_elf
3891 ? get_32bit_program_headers (file, phdrs)
3892 : get_64bit_program_headers (file, phdrs))
3893 {
3894 program_headers = phdrs;
3895 return 1;
3896 }
3897
3898 free (phdrs);
3899 return 0;
3900 }
3901
3902 /* Returns 1 if the program headers were loaded. */
3903
3904 static int
3905 process_program_headers (FILE * file)
3906 {
3907 Elf_Internal_Phdr * segment;
3908 unsigned int i;
3909
3910 if (elf_header.e_phnum == 0)
3911 {
3912 /* PR binutils/12467. */
3913 if (elf_header.e_phoff != 0)
3914 warn (_("possibly corrupt ELF header - it has a non-zero program"
3915 " header offset, but no program headers"));
3916 else if (do_segments)
3917 printf (_("\nThere are no program headers in this file.\n"));
3918 return 0;
3919 }
3920
3921 if (do_segments && !do_header)
3922 {
3923 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3924 printf (_("Entry point "));
3925 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3926 printf (_("\nThere are %d program headers, starting at offset "),
3927 elf_header.e_phnum);
3928 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3929 printf ("\n");
3930 }
3931
3932 if (! get_program_headers (file))
3933 return 0;
3934
3935 if (do_segments)
3936 {
3937 if (elf_header.e_phnum > 1)
3938 printf (_("\nProgram Headers:\n"));
3939 else
3940 printf (_("\nProgram Headers:\n"));
3941
3942 if (is_32bit_elf)
3943 printf
3944 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3945 else if (do_wide)
3946 printf
3947 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3948 else
3949 {
3950 printf
3951 (_(" Type Offset VirtAddr PhysAddr\n"));
3952 printf
3953 (_(" FileSiz MemSiz Flags Align\n"));
3954 }
3955 }
3956
3957 dynamic_addr = 0;
3958 dynamic_size = 0;
3959
3960 for (i = 0, segment = program_headers;
3961 i < elf_header.e_phnum;
3962 i++, segment++)
3963 {
3964 if (do_segments)
3965 {
3966 printf (" %-14.14s ", get_segment_type (segment->p_type));
3967
3968 if (is_32bit_elf)
3969 {
3970 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3971 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3972 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3973 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3974 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3975 printf ("%c%c%c ",
3976 (segment->p_flags & PF_R ? 'R' : ' '),
3977 (segment->p_flags & PF_W ? 'W' : ' '),
3978 (segment->p_flags & PF_X ? 'E' : ' '));
3979 printf ("%#lx", (unsigned long) segment->p_align);
3980 }
3981 else if (do_wide)
3982 {
3983 if ((unsigned long) segment->p_offset == segment->p_offset)
3984 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3985 else
3986 {
3987 print_vma (segment->p_offset, FULL_HEX);
3988 putchar (' ');
3989 }
3990
3991 print_vma (segment->p_vaddr, FULL_HEX);
3992 putchar (' ');
3993 print_vma (segment->p_paddr, FULL_HEX);
3994 putchar (' ');
3995
3996 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3997 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3998 else
3999 {
4000 print_vma (segment->p_filesz, FULL_HEX);
4001 putchar (' ');
4002 }
4003
4004 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4005 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4006 else
4007 {
4008 print_vma (segment->p_memsz, FULL_HEX);
4009 }
4010
4011 printf (" %c%c%c ",
4012 (segment->p_flags & PF_R ? 'R' : ' '),
4013 (segment->p_flags & PF_W ? 'W' : ' '),
4014 (segment->p_flags & PF_X ? 'E' : ' '));
4015
4016 if ((unsigned long) segment->p_align == segment->p_align)
4017 printf ("%#lx", (unsigned long) segment->p_align);
4018 else
4019 {
4020 print_vma (segment->p_align, PREFIX_HEX);
4021 }
4022 }
4023 else
4024 {
4025 print_vma (segment->p_offset, FULL_HEX);
4026 putchar (' ');
4027 print_vma (segment->p_vaddr, FULL_HEX);
4028 putchar (' ');
4029 print_vma (segment->p_paddr, FULL_HEX);
4030 printf ("\n ");
4031 print_vma (segment->p_filesz, FULL_HEX);
4032 putchar (' ');
4033 print_vma (segment->p_memsz, FULL_HEX);
4034 printf (" %c%c%c ",
4035 (segment->p_flags & PF_R ? 'R' : ' '),
4036 (segment->p_flags & PF_W ? 'W' : ' '),
4037 (segment->p_flags & PF_X ? 'E' : ' '));
4038 print_vma (segment->p_align, HEX);
4039 }
4040 }
4041
4042 switch (segment->p_type)
4043 {
4044 case PT_DYNAMIC:
4045 if (dynamic_addr)
4046 error (_("more than one dynamic segment\n"));
4047
4048 /* By default, assume that the .dynamic section is the first
4049 section in the DYNAMIC segment. */
4050 dynamic_addr = segment->p_offset;
4051 dynamic_size = segment->p_filesz;
4052
4053 /* Try to locate the .dynamic section. If there is
4054 a section header table, we can easily locate it. */
4055 if (section_headers != NULL)
4056 {
4057 Elf_Internal_Shdr * sec;
4058
4059 sec = find_section (".dynamic");
4060 if (sec == NULL || sec->sh_size == 0)
4061 {
4062 /* A corresponding .dynamic section is expected, but on
4063 IA-64/OpenVMS it is OK for it to be missing. */
4064 if (!is_ia64_vms ())
4065 error (_("no .dynamic section in the dynamic segment\n"));
4066 break;
4067 }
4068
4069 if (sec->sh_type == SHT_NOBITS)
4070 {
4071 dynamic_size = 0;
4072 break;
4073 }
4074
4075 dynamic_addr = sec->sh_offset;
4076 dynamic_size = sec->sh_size;
4077
4078 if (dynamic_addr < segment->p_offset
4079 || dynamic_addr > segment->p_offset + segment->p_filesz)
4080 warn (_("the .dynamic section is not contained"
4081 " within the dynamic segment\n"));
4082 else if (dynamic_addr > segment->p_offset)
4083 warn (_("the .dynamic section is not the first section"
4084 " in the dynamic segment.\n"));
4085 }
4086 break;
4087
4088 case PT_INTERP:
4089 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4090 SEEK_SET))
4091 error (_("Unable to find program interpreter name\n"));
4092 else
4093 {
4094 char fmt [32];
4095 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
4096
4097 if (ret >= (int) sizeof (fmt) || ret < 0)
4098 error (_("Internal error: failed to create format string to display program interpreter\n"));
4099
4100 program_interpreter[0] = 0;
4101 if (fscanf (file, fmt, program_interpreter) <= 0)
4102 error (_("Unable to read program interpreter name\n"));
4103
4104 if (do_segments)
4105 printf (_("\n [Requesting program interpreter: %s]"),
4106 program_interpreter);
4107 }
4108 break;
4109 }
4110
4111 if (do_segments)
4112 putc ('\n', stdout);
4113 }
4114
4115 if (do_segments && section_headers != NULL && string_table != NULL)
4116 {
4117 printf (_("\n Section to Segment mapping:\n"));
4118 printf (_(" Segment Sections...\n"));
4119
4120 for (i = 0; i < elf_header.e_phnum; i++)
4121 {
4122 unsigned int j;
4123 Elf_Internal_Shdr * section;
4124
4125 segment = program_headers + i;
4126 section = section_headers + 1;
4127
4128 printf (" %2.2d ", i);
4129
4130 for (j = 1; j < elf_header.e_shnum; j++, section++)
4131 {
4132 if (!ELF_TBSS_SPECIAL (section, segment)
4133 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4134 printf ("%s ", SECTION_NAME (section));
4135 }
4136
4137 putc ('\n',stdout);
4138 }
4139 }
4140
4141 return 1;
4142 }
4143
4144
4145 /* Find the file offset corresponding to VMA by using the program headers. */
4146
4147 static long
4148 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4149 {
4150 Elf_Internal_Phdr * seg;
4151
4152 if (! get_program_headers (file))
4153 {
4154 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4155 return (long) vma;
4156 }
4157
4158 for (seg = program_headers;
4159 seg < program_headers + elf_header.e_phnum;
4160 ++seg)
4161 {
4162 if (seg->p_type != PT_LOAD)
4163 continue;
4164
4165 if (vma >= (seg->p_vaddr & -seg->p_align)
4166 && vma + size <= seg->p_vaddr + seg->p_filesz)
4167 return vma - seg->p_vaddr + seg->p_offset;
4168 }
4169
4170 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4171 (unsigned long) vma);
4172 return (long) vma;
4173 }
4174
4175
4176 static int
4177 get_32bit_section_headers (FILE * file, unsigned int num)
4178 {
4179 Elf32_External_Shdr * shdrs;
4180 Elf_Internal_Shdr * internal;
4181 unsigned int i;
4182
4183 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4184 elf_header.e_shentsize, num,
4185 _("section headers"));
4186 if (!shdrs)
4187 return 0;
4188
4189 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4190 sizeof (Elf_Internal_Shdr));
4191
4192 if (section_headers == NULL)
4193 {
4194 error (_("Out of memory\n"));
4195 return 0;
4196 }
4197
4198 for (i = 0, internal = section_headers;
4199 i < num;
4200 i++, internal++)
4201 {
4202 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4203 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4204 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4205 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4206 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4207 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4208 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4209 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4210 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4211 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4212 }
4213
4214 free (shdrs);
4215
4216 return 1;
4217 }
4218
4219 static int
4220 get_64bit_section_headers (FILE * file, unsigned int num)
4221 {
4222 Elf64_External_Shdr * shdrs;
4223 Elf_Internal_Shdr * internal;
4224 unsigned int i;
4225
4226 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4227 elf_header.e_shentsize, num,
4228 _("section headers"));
4229 if (!shdrs)
4230 return 0;
4231
4232 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4233 sizeof (Elf_Internal_Shdr));
4234
4235 if (section_headers == NULL)
4236 {
4237 error (_("Out of memory\n"));
4238 return 0;
4239 }
4240
4241 for (i = 0, internal = section_headers;
4242 i < num;
4243 i++, internal++)
4244 {
4245 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4246 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4247 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4248 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4249 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4250 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4251 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4252 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4253 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4254 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4255 }
4256
4257 free (shdrs);
4258
4259 return 1;
4260 }
4261
4262 static Elf_Internal_Sym *
4263 get_32bit_elf_symbols (FILE * file,
4264 Elf_Internal_Shdr * section,
4265 unsigned long * num_syms_return)
4266 {
4267 unsigned long number = 0;
4268 Elf32_External_Sym * esyms = NULL;
4269 Elf_External_Sym_Shndx * shndx = NULL;
4270 Elf_Internal_Sym * isyms = NULL;
4271 Elf_Internal_Sym * psym;
4272 unsigned int j;
4273
4274 /* Run some sanity checks first. */
4275 if (section->sh_entsize == 0)
4276 {
4277 error (_("sh_entsize is zero\n"));
4278 goto exit_point;
4279 }
4280
4281 number = section->sh_size / section->sh_entsize;
4282
4283 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4284 {
4285 error (_("Invalid sh_entsize\n"));
4286 goto exit_point;
4287 }
4288
4289 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4290 section->sh_size, _("symbols"));
4291 if (esyms == NULL)
4292 goto exit_point;
4293
4294 shndx = NULL;
4295 if (symtab_shndx_hdr != NULL
4296 && (symtab_shndx_hdr->sh_link
4297 == (unsigned long) (section - section_headers)))
4298 {
4299 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4300 symtab_shndx_hdr->sh_offset,
4301 1, symtab_shndx_hdr->sh_size,
4302 _("symbol table section indicies"));
4303 if (shndx == NULL)
4304 goto exit_point;
4305 }
4306
4307 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4308
4309 if (isyms == NULL)
4310 {
4311 error (_("Out of memory\n"));
4312 goto exit_point;
4313 }
4314
4315 for (j = 0, psym = isyms; j < number; j++, psym++)
4316 {
4317 psym->st_name = BYTE_GET (esyms[j].st_name);
4318 psym->st_value = BYTE_GET (esyms[j].st_value);
4319 psym->st_size = BYTE_GET (esyms[j].st_size);
4320 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4321 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4322 psym->st_shndx
4323 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4324 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4325 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4326 psym->st_info = BYTE_GET (esyms[j].st_info);
4327 psym->st_other = BYTE_GET (esyms[j].st_other);
4328 }
4329
4330 exit_point:
4331 if (shndx != NULL)
4332 free (shndx);
4333 if (esyms != NULL)
4334 free (esyms);
4335
4336 if (num_syms_return != NULL)
4337 * num_syms_return = isyms == NULL ? 0 : number;
4338
4339 return isyms;
4340 }
4341
4342 static Elf_Internal_Sym *
4343 get_64bit_elf_symbols (FILE * file,
4344 Elf_Internal_Shdr * section,
4345 unsigned long * num_syms_return)
4346 {
4347 unsigned long number = 0;
4348 Elf64_External_Sym * esyms = NULL;
4349 Elf_External_Sym_Shndx * shndx = NULL;
4350 Elf_Internal_Sym * isyms = NULL;
4351 Elf_Internal_Sym * psym;
4352 unsigned int j;
4353
4354 /* Run some sanity checks first. */
4355 if (section->sh_entsize == 0)
4356 {
4357 error (_("sh_entsize is zero\n"));
4358 goto exit_point;
4359 }
4360
4361 number = section->sh_size / section->sh_entsize;
4362
4363 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4364 {
4365 error (_("Invalid sh_entsize\n"));
4366 goto exit_point;
4367 }
4368
4369 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4370 section->sh_size, _("symbols"));
4371 if (!esyms)
4372 goto exit_point;
4373
4374 if (symtab_shndx_hdr != NULL
4375 && (symtab_shndx_hdr->sh_link
4376 == (unsigned long) (section - section_headers)))
4377 {
4378 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4379 symtab_shndx_hdr->sh_offset,
4380 1, symtab_shndx_hdr->sh_size,
4381 _("symbol table section indicies"));
4382 if (shndx == NULL)
4383 goto exit_point;
4384 }
4385
4386 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4387
4388 if (isyms == NULL)
4389 {
4390 error (_("Out of memory\n"));
4391 goto exit_point;
4392 }
4393
4394 for (j = 0, psym = isyms; j < number; j++, psym++)
4395 {
4396 psym->st_name = BYTE_GET (esyms[j].st_name);
4397 psym->st_info = BYTE_GET (esyms[j].st_info);
4398 psym->st_other = BYTE_GET (esyms[j].st_other);
4399 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4400
4401 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4402 psym->st_shndx
4403 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4404 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4405 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4406
4407 psym->st_value = BYTE_GET (esyms[j].st_value);
4408 psym->st_size = BYTE_GET (esyms[j].st_size);
4409 }
4410
4411 exit_point:
4412 if (shndx != NULL)
4413 free (shndx);
4414 if (esyms != NULL)
4415 free (esyms);
4416
4417 if (num_syms_return != NULL)
4418 * num_syms_return = isyms == NULL ? 0 : number;
4419
4420 return isyms;
4421 }
4422
4423 static const char *
4424 get_elf_section_flags (bfd_vma sh_flags)
4425 {
4426 static char buff[1024];
4427 char * p = buff;
4428 int field_size = is_32bit_elf ? 8 : 16;
4429 int sindex;
4430 int size = sizeof (buff) - (field_size + 4 + 1);
4431 bfd_vma os_flags = 0;
4432 bfd_vma proc_flags = 0;
4433 bfd_vma unknown_flags = 0;
4434 static const struct
4435 {
4436 const char * str;
4437 int len;
4438 }
4439 flags [] =
4440 {
4441 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4442 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4443 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4444 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4445 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4446 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4447 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4448 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4449 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4450 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4451 /* IA-64 specific. */
4452 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4453 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4454 /* IA-64 OpenVMS specific. */
4455 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4456 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4457 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4458 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4459 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4460 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4461 /* Generic. */
4462 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4463 /* SPARC specific. */
4464 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4465 };
4466
4467 if (do_section_details)
4468 {
4469 sprintf (buff, "[%*.*lx]: ",
4470 field_size, field_size, (unsigned long) sh_flags);
4471 p += field_size + 4;
4472 }
4473
4474 while (sh_flags)
4475 {
4476 bfd_vma flag;
4477
4478 flag = sh_flags & - sh_flags;
4479 sh_flags &= ~ flag;
4480
4481 if (do_section_details)
4482 {
4483 switch (flag)
4484 {
4485 case SHF_WRITE: sindex = 0; break;
4486 case SHF_ALLOC: sindex = 1; break;
4487 case SHF_EXECINSTR: sindex = 2; break;
4488 case SHF_MERGE: sindex = 3; break;
4489 case SHF_STRINGS: sindex = 4; break;
4490 case SHF_INFO_LINK: sindex = 5; break;
4491 case SHF_LINK_ORDER: sindex = 6; break;
4492 case SHF_OS_NONCONFORMING: sindex = 7; break;
4493 case SHF_GROUP: sindex = 8; break;
4494 case SHF_TLS: sindex = 9; break;
4495 case SHF_EXCLUDE: sindex = 18; break;
4496
4497 default:
4498 sindex = -1;
4499 switch (elf_header.e_machine)
4500 {
4501 case EM_IA_64:
4502 if (flag == SHF_IA_64_SHORT)
4503 sindex = 10;
4504 else if (flag == SHF_IA_64_NORECOV)
4505 sindex = 11;
4506 #ifdef BFD64
4507 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4508 switch (flag)
4509 {
4510 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4511 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4512 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4513 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4514 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4515 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4516 default: break;
4517 }
4518 #endif
4519 break;
4520
4521 case EM_386:
4522 case EM_486:
4523 case EM_X86_64:
4524 case EM_L1OM:
4525 case EM_K1OM:
4526 case EM_OLD_SPARCV9:
4527 case EM_SPARC32PLUS:
4528 case EM_SPARCV9:
4529 case EM_SPARC:
4530 if (flag == SHF_ORDERED)
4531 sindex = 19;
4532 break;
4533 default:
4534 break;
4535 }
4536 }
4537
4538 if (sindex != -1)
4539 {
4540 if (p != buff + field_size + 4)
4541 {
4542 if (size < (10 + 2))
4543 abort ();
4544 size -= 2;
4545 *p++ = ',';
4546 *p++ = ' ';
4547 }
4548
4549 size -= flags [sindex].len;
4550 p = stpcpy (p, flags [sindex].str);
4551 }
4552 else if (flag & SHF_MASKOS)
4553 os_flags |= flag;
4554 else if (flag & SHF_MASKPROC)
4555 proc_flags |= flag;
4556 else
4557 unknown_flags |= flag;
4558 }
4559 else
4560 {
4561 switch (flag)
4562 {
4563 case SHF_WRITE: *p = 'W'; break;
4564 case SHF_ALLOC: *p = 'A'; break;
4565 case SHF_EXECINSTR: *p = 'X'; break;
4566 case SHF_MERGE: *p = 'M'; break;
4567 case SHF_STRINGS: *p = 'S'; break;
4568 case SHF_INFO_LINK: *p = 'I'; break;
4569 case SHF_LINK_ORDER: *p = 'L'; break;
4570 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4571 case SHF_GROUP: *p = 'G'; break;
4572 case SHF_TLS: *p = 'T'; break;
4573 case SHF_EXCLUDE: *p = 'E'; break;
4574
4575 default:
4576 if ((elf_header.e_machine == EM_X86_64
4577 || elf_header.e_machine == EM_L1OM
4578 || elf_header.e_machine == EM_K1OM)
4579 && flag == SHF_X86_64_LARGE)
4580 *p = 'l';
4581 else if (flag & SHF_MASKOS)
4582 {
4583 *p = 'o';
4584 sh_flags &= ~ SHF_MASKOS;
4585 }
4586 else if (flag & SHF_MASKPROC)
4587 {
4588 *p = 'p';
4589 sh_flags &= ~ SHF_MASKPROC;
4590 }
4591 else
4592 *p = 'x';
4593 break;
4594 }
4595 p++;
4596 }
4597 }
4598
4599 if (do_section_details)
4600 {
4601 if (os_flags)
4602 {
4603 size -= 5 + field_size;
4604 if (p != buff + field_size + 4)
4605 {
4606 if (size < (2 + 1))
4607 abort ();
4608 size -= 2;
4609 *p++ = ',';
4610 *p++ = ' ';
4611 }
4612 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4613 (unsigned long) os_flags);
4614 p += 5 + field_size;
4615 }
4616 if (proc_flags)
4617 {
4618 size -= 7 + field_size;
4619 if (p != buff + field_size + 4)
4620 {
4621 if (size < (2 + 1))
4622 abort ();
4623 size -= 2;
4624 *p++ = ',';
4625 *p++ = ' ';
4626 }
4627 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4628 (unsigned long) proc_flags);
4629 p += 7 + field_size;
4630 }
4631 if (unknown_flags)
4632 {
4633 size -= 10 + field_size;
4634 if (p != buff + field_size + 4)
4635 {
4636 if (size < (2 + 1))
4637 abort ();
4638 size -= 2;
4639 *p++ = ',';
4640 *p++ = ' ';
4641 }
4642 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4643 (unsigned long) unknown_flags);
4644 p += 10 + field_size;
4645 }
4646 }
4647
4648 *p = '\0';
4649 return buff;
4650 }
4651
4652 static int
4653 process_section_headers (FILE * file)
4654 {
4655 Elf_Internal_Shdr * section;
4656 unsigned int i;
4657
4658 section_headers = NULL;
4659
4660 if (elf_header.e_shnum == 0)
4661 {
4662 /* PR binutils/12467. */
4663 if (elf_header.e_shoff != 0)
4664 warn (_("possibly corrupt ELF file header - it has a non-zero"
4665 " section header offset, but no section headers\n"));
4666 else if (do_sections)
4667 printf (_("\nThere are no sections in this file.\n"));
4668
4669 return 1;
4670 }
4671
4672 if (do_sections && !do_header)
4673 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4674 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4675
4676 if (is_32bit_elf)
4677 {
4678 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4679 return 0;
4680 }
4681 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4682 return 0;
4683
4684 /* Read in the string table, so that we have names to display. */
4685 if (elf_header.e_shstrndx != SHN_UNDEF
4686 && elf_header.e_shstrndx < elf_header.e_shnum)
4687 {
4688 section = section_headers + elf_header.e_shstrndx;
4689
4690 if (section->sh_size != 0)
4691 {
4692 string_table = (char *) get_data (NULL, file, section->sh_offset,
4693 1, section->sh_size,
4694 _("string table"));
4695
4696 string_table_length = string_table != NULL ? section->sh_size : 0;
4697 }
4698 }
4699
4700 /* Scan the sections for the dynamic symbol table
4701 and dynamic string table and debug sections. */
4702 dynamic_symbols = NULL;
4703 dynamic_strings = NULL;
4704 dynamic_syminfo = NULL;
4705 symtab_shndx_hdr = NULL;
4706
4707 eh_addr_size = is_32bit_elf ? 4 : 8;
4708 switch (elf_header.e_machine)
4709 {
4710 case EM_MIPS:
4711 case EM_MIPS_RS3_LE:
4712 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4713 FDE addresses. However, the ABI also has a semi-official ILP32
4714 variant for which the normal FDE address size rules apply.
4715
4716 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4717 section, where XX is the size of longs in bits. Unfortunately,
4718 earlier compilers provided no way of distinguishing ILP32 objects
4719 from LP64 objects, so if there's any doubt, we should assume that
4720 the official LP64 form is being used. */
4721 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4722 && find_section (".gcc_compiled_long32") == NULL)
4723 eh_addr_size = 8;
4724 break;
4725
4726 case EM_H8_300:
4727 case EM_H8_300H:
4728 switch (elf_header.e_flags & EF_H8_MACH)
4729 {
4730 case E_H8_MACH_H8300:
4731 case E_H8_MACH_H8300HN:
4732 case E_H8_MACH_H8300SN:
4733 case E_H8_MACH_H8300SXN:
4734 eh_addr_size = 2;
4735 break;
4736 case E_H8_MACH_H8300H:
4737 case E_H8_MACH_H8300S:
4738 case E_H8_MACH_H8300SX:
4739 eh_addr_size = 4;
4740 break;
4741 }
4742 break;
4743
4744 case EM_M32C_OLD:
4745 case EM_M32C:
4746 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4747 {
4748 case EF_M32C_CPU_M16C:
4749 eh_addr_size = 2;
4750 break;
4751 }
4752 break;
4753 }
4754
4755 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4756 do \
4757 { \
4758 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
4759 if (section->sh_entsize != expected_entsize) \
4760 { \
4761 error (_("Section %d has invalid sh_entsize of %" BFD_VMA_FMT "x\n"), \
4762 i, section->sh_entsize); \
4763 error (_("(Using the expected size of %d for the rest of this dump)\n"), \
4764 (int) expected_entsize); \
4765 section->sh_entsize = expected_entsize; \
4766 } \
4767 } \
4768 while (0)
4769
4770 #define CHECK_ENTSIZE(section, i, type) \
4771 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4772 sizeof (Elf64_External_##type))
4773
4774 for (i = 0, section = section_headers;
4775 i < elf_header.e_shnum;
4776 i++, section++)
4777 {
4778 char * name = SECTION_NAME (section);
4779
4780 if (section->sh_type == SHT_DYNSYM)
4781 {
4782 if (dynamic_symbols != NULL)
4783 {
4784 error (_("File contains multiple dynamic symbol tables\n"));
4785 continue;
4786 }
4787
4788 CHECK_ENTSIZE (section, i, Sym);
4789 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
4790 }
4791 else if (section->sh_type == SHT_STRTAB
4792 && streq (name, ".dynstr"))
4793 {
4794 if (dynamic_strings != NULL)
4795 {
4796 error (_("File contains multiple dynamic string tables\n"));
4797 continue;
4798 }
4799
4800 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4801 1, section->sh_size,
4802 _("dynamic strings"));
4803 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4804 }
4805 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4806 {
4807 if (symtab_shndx_hdr != NULL)
4808 {
4809 error (_("File contains multiple symtab shndx tables\n"));
4810 continue;
4811 }
4812 symtab_shndx_hdr = section;
4813 }
4814 else if (section->sh_type == SHT_SYMTAB)
4815 CHECK_ENTSIZE (section, i, Sym);
4816 else if (section->sh_type == SHT_GROUP)
4817 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4818 else if (section->sh_type == SHT_REL)
4819 CHECK_ENTSIZE (section, i, Rel);
4820 else if (section->sh_type == SHT_RELA)
4821 CHECK_ENTSIZE (section, i, Rela);
4822 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4823 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4824 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4825 || do_debug_str || do_debug_loc || do_debug_ranges
4826 || do_debug_addr || do_debug_cu_index)
4827 && (const_strneq (name, ".debug_")
4828 || const_strneq (name, ".zdebug_")))
4829 {
4830 if (name[1] == 'z')
4831 name += sizeof (".zdebug_") - 1;
4832 else
4833 name += sizeof (".debug_") - 1;
4834
4835 if (do_debugging
4836 || (do_debug_info && const_strneq (name, "info"))
4837 || (do_debug_info && const_strneq (name, "types"))
4838 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
4839 || (do_debug_lines && const_strneq (name, "line"))
4840 || (do_debug_pubnames && const_strneq (name, "pubnames"))
4841 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
4842 || (do_debug_aranges && const_strneq (name, "aranges"))
4843 || (do_debug_ranges && const_strneq (name, "ranges"))
4844 || (do_debug_frames && const_strneq (name, "frame"))
4845 || (do_debug_macinfo && const_strneq (name, "macinfo"))
4846 || (do_debug_macinfo && const_strneq (name, "macro"))
4847 || (do_debug_str && const_strneq (name, "str"))
4848 || (do_debug_loc && const_strneq (name, "loc"))
4849 || (do_debug_addr && const_strneq (name, "addr"))
4850 || (do_debug_cu_index && const_strneq (name, "cu_index"))
4851 || (do_debug_cu_index && const_strneq (name, "tu_index"))
4852 )
4853 request_dump_bynumber (i, DEBUG_DUMP);
4854 }
4855 /* Linkonce section to be combined with .debug_info at link time. */
4856 else if ((do_debugging || do_debug_info)
4857 && const_strneq (name, ".gnu.linkonce.wi."))
4858 request_dump_bynumber (i, DEBUG_DUMP);
4859 else if (do_debug_frames && streq (name, ".eh_frame"))
4860 request_dump_bynumber (i, DEBUG_DUMP);
4861 else if (do_gdb_index && streq (name, ".gdb_index"))
4862 request_dump_bynumber (i, DEBUG_DUMP);
4863 /* Trace sections for Itanium VMS. */
4864 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4865 || do_trace_aranges)
4866 && const_strneq (name, ".trace_"))
4867 {
4868 name += sizeof (".trace_") - 1;
4869
4870 if (do_debugging
4871 || (do_trace_info && streq (name, "info"))
4872 || (do_trace_abbrevs && streq (name, "abbrev"))
4873 || (do_trace_aranges && streq (name, "aranges"))
4874 )
4875 request_dump_bynumber (i, DEBUG_DUMP);
4876 }
4877
4878 }
4879
4880 if (! do_sections)
4881 return 1;
4882
4883 if (elf_header.e_shnum > 1)
4884 printf (_("\nSection Headers:\n"));
4885 else
4886 printf (_("\nSection Header:\n"));
4887
4888 if (is_32bit_elf)
4889 {
4890 if (do_section_details)
4891 {
4892 printf (_(" [Nr] Name\n"));
4893 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4894 }
4895 else
4896 printf
4897 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4898 }
4899 else if (do_wide)
4900 {
4901 if (do_section_details)
4902 {
4903 printf (_(" [Nr] Name\n"));
4904 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4905 }
4906 else
4907 printf
4908 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4909 }
4910 else
4911 {
4912 if (do_section_details)
4913 {
4914 printf (_(" [Nr] Name\n"));
4915 printf (_(" Type Address Offset Link\n"));
4916 printf (_(" Size EntSize Info Align\n"));
4917 }
4918 else
4919 {
4920 printf (_(" [Nr] Name Type Address Offset\n"));
4921 printf (_(" Size EntSize Flags Link Info Align\n"));
4922 }
4923 }
4924
4925 if (do_section_details)
4926 printf (_(" Flags\n"));
4927
4928 for (i = 0, section = section_headers;
4929 i < elf_header.e_shnum;
4930 i++, section++)
4931 {
4932 printf (" [%2u] ", i);
4933 if (do_section_details)
4934 {
4935 print_symbol (INT_MAX, SECTION_NAME (section));
4936 printf ("\n ");
4937 }
4938 else
4939 {
4940 print_symbol (-17, SECTION_NAME (section));
4941 }
4942
4943 printf (do_wide ? " %-15s " : " %-15.15s ",
4944 get_section_type_name (section->sh_type));
4945
4946 if (is_32bit_elf)
4947 {
4948 const char * link_too_big = NULL;
4949
4950 print_vma (section->sh_addr, LONG_HEX);
4951
4952 printf ( " %6.6lx %6.6lx %2.2lx",
4953 (unsigned long) section->sh_offset,
4954 (unsigned long) section->sh_size,
4955 (unsigned long) section->sh_entsize);
4956
4957 if (do_section_details)
4958 fputs (" ", stdout);
4959 else
4960 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4961
4962 if (section->sh_link >= elf_header.e_shnum)
4963 {
4964 link_too_big = "";
4965 /* The sh_link value is out of range. Normally this indicates
4966 an error but it can have special values in Solaris binaries. */
4967 switch (elf_header.e_machine)
4968 {
4969 case EM_386:
4970 case EM_486:
4971 case EM_X86_64:
4972 case EM_L1OM:
4973 case EM_K1OM:
4974 case EM_OLD_SPARCV9:
4975 case EM_SPARC32PLUS:
4976 case EM_SPARCV9:
4977 case EM_SPARC:
4978 if (section->sh_link == (SHN_BEFORE & 0xffff))
4979 link_too_big = "BEFORE";
4980 else if (section->sh_link == (SHN_AFTER & 0xffff))
4981 link_too_big = "AFTER";
4982 break;
4983 default:
4984 break;
4985 }
4986 }
4987
4988 if (do_section_details)
4989 {
4990 if (link_too_big != NULL && * link_too_big)
4991 printf ("<%s> ", link_too_big);
4992 else
4993 printf ("%2u ", section->sh_link);
4994 printf ("%3u %2lu\n", section->sh_info,
4995 (unsigned long) section->sh_addralign);
4996 }
4997 else
4998 printf ("%2u %3u %2lu\n",
4999 section->sh_link,
5000 section->sh_info,
5001 (unsigned long) section->sh_addralign);
5002
5003 if (link_too_big && ! * link_too_big)
5004 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5005 i, section->sh_link);
5006 }
5007 else if (do_wide)
5008 {
5009 print_vma (section->sh_addr, LONG_HEX);
5010
5011 if ((long) section->sh_offset == section->sh_offset)
5012 printf (" %6.6lx", (unsigned long) section->sh_offset);
5013 else
5014 {
5015 putchar (' ');
5016 print_vma (section->sh_offset, LONG_HEX);
5017 }
5018
5019 if ((unsigned long) section->sh_size == section->sh_size)
5020 printf (" %6.6lx", (unsigned long) section->sh_size);
5021 else
5022 {
5023 putchar (' ');
5024 print_vma (section->sh_size, LONG_HEX);
5025 }
5026
5027 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5028 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5029 else
5030 {
5031 putchar (' ');
5032 print_vma (section->sh_entsize, LONG_HEX);
5033 }
5034
5035 if (do_section_details)
5036 fputs (" ", stdout);
5037 else
5038 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5039
5040 printf ("%2u %3u ", section->sh_link, section->sh_info);
5041
5042 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5043 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5044 else
5045 {
5046 print_vma (section->sh_addralign, DEC);
5047 putchar ('\n');
5048 }
5049 }
5050 else if (do_section_details)
5051 {
5052 printf (" %-15.15s ",
5053 get_section_type_name (section->sh_type));
5054 print_vma (section->sh_addr, LONG_HEX);
5055 if ((long) section->sh_offset == section->sh_offset)
5056 printf (" %16.16lx", (unsigned long) section->sh_offset);
5057 else
5058 {
5059 printf (" ");
5060 print_vma (section->sh_offset, LONG_HEX);
5061 }
5062 printf (" %u\n ", section->sh_link);
5063 print_vma (section->sh_size, LONG_HEX);
5064 putchar (' ');
5065 print_vma (section->sh_entsize, LONG_HEX);
5066
5067 printf (" %-16u %lu\n",
5068 section->sh_info,
5069 (unsigned long) section->sh_addralign);
5070 }
5071 else
5072 {
5073 putchar (' ');
5074 print_vma (section->sh_addr, LONG_HEX);
5075 if ((long) section->sh_offset == section->sh_offset)
5076 printf (" %8.8lx", (unsigned long) section->sh_offset);
5077 else
5078 {
5079 printf (" ");
5080 print_vma (section->sh_offset, LONG_HEX);
5081 }
5082 printf ("\n ");
5083 print_vma (section->sh_size, LONG_HEX);
5084 printf (" ");
5085 print_vma (section->sh_entsize, LONG_HEX);
5086
5087 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5088
5089 printf (" %2u %3u %lu\n",
5090 section->sh_link,
5091 section->sh_info,
5092 (unsigned long) section->sh_addralign);
5093 }
5094
5095 if (do_section_details)
5096 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5097 }
5098
5099 if (!do_section_details)
5100 {
5101 if (elf_header.e_machine == EM_X86_64
5102 || elf_header.e_machine == EM_L1OM
5103 || elf_header.e_machine == EM_K1OM)
5104 printf (_("Key to Flags:\n\
5105 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5106 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5107 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5108 else
5109 printf (_("Key to Flags:\n\
5110 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5111 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5112 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5113 }
5114
5115 return 1;
5116 }
5117
5118 static const char *
5119 get_group_flags (unsigned int flags)
5120 {
5121 static char buff[32];
5122 switch (flags)
5123 {
5124 case 0:
5125 return "";
5126
5127 case GRP_COMDAT:
5128 return "COMDAT ";
5129
5130 default:
5131 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5132 break;
5133 }
5134 return buff;
5135 }
5136
5137 static int
5138 process_section_groups (FILE * file)
5139 {
5140 Elf_Internal_Shdr * section;
5141 unsigned int i;
5142 struct group * group;
5143 Elf_Internal_Shdr * symtab_sec;
5144 Elf_Internal_Shdr * strtab_sec;
5145 Elf_Internal_Sym * symtab;
5146 unsigned long num_syms;
5147 char * strtab;
5148 size_t strtab_size;
5149
5150 /* Don't process section groups unless needed. */
5151 if (!do_unwind && !do_section_groups)
5152 return 1;
5153
5154 if (elf_header.e_shnum == 0)
5155 {
5156 if (do_section_groups)
5157 printf (_("\nThere are no sections to group in this file.\n"));
5158
5159 return 1;
5160 }
5161
5162 if (section_headers == NULL)
5163 {
5164 error (_("Section headers are not available!\n"));
5165 /* PR 13622: This can happen with a corrupt ELF header. */
5166 return 0;
5167 }
5168
5169 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5170 sizeof (struct group *));
5171
5172 if (section_headers_groups == NULL)
5173 {
5174 error (_("Out of memory\n"));
5175 return 0;
5176 }
5177
5178 /* Scan the sections for the group section. */
5179 group_count = 0;
5180 for (i = 0, section = section_headers;
5181 i < elf_header.e_shnum;
5182 i++, section++)
5183 if (section->sh_type == SHT_GROUP)
5184 group_count++;
5185
5186 if (group_count == 0)
5187 {
5188 if (do_section_groups)
5189 printf (_("\nThere are no section groups in this file.\n"));
5190
5191 return 1;
5192 }
5193
5194 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5195
5196 if (section_groups == NULL)
5197 {
5198 error (_("Out of memory\n"));
5199 return 0;
5200 }
5201
5202 symtab_sec = NULL;
5203 strtab_sec = NULL;
5204 symtab = NULL;
5205 num_syms = 0;
5206 strtab = NULL;
5207 strtab_size = 0;
5208 for (i = 0, section = section_headers, group = section_groups;
5209 i < elf_header.e_shnum;
5210 i++, section++)
5211 {
5212 if (section->sh_type == SHT_GROUP)
5213 {
5214 char * name = SECTION_NAME (section);
5215 char * group_name;
5216 unsigned char * start;
5217 unsigned char * indices;
5218 unsigned int entry, j, size;
5219 Elf_Internal_Shdr * sec;
5220 Elf_Internal_Sym * sym;
5221
5222 /* Get the symbol table. */
5223 if (section->sh_link >= elf_header.e_shnum
5224 || ((sec = section_headers + section->sh_link)->sh_type
5225 != SHT_SYMTAB))
5226 {
5227 error (_("Bad sh_link in group section `%s'\n"), name);
5228 continue;
5229 }
5230
5231 if (symtab_sec != sec)
5232 {
5233 symtab_sec = sec;
5234 if (symtab)
5235 free (symtab);
5236 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5237 }
5238
5239 if (symtab == NULL)
5240 {
5241 error (_("Corrupt header in group section `%s'\n"), name);
5242 continue;
5243 }
5244
5245 if (section->sh_info >= num_syms)
5246 {
5247 error (_("Bad sh_info in group section `%s'\n"), name);
5248 continue;
5249 }
5250
5251 sym = symtab + section->sh_info;
5252
5253 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5254 {
5255 if (sym->st_shndx == 0
5256 || sym->st_shndx >= elf_header.e_shnum)
5257 {
5258 error (_("Bad sh_info in group section `%s'\n"), name);
5259 continue;
5260 }
5261
5262 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5263 strtab_sec = NULL;
5264 if (strtab)
5265 free (strtab);
5266 strtab = NULL;
5267 strtab_size = 0;
5268 }
5269 else
5270 {
5271 /* Get the string table. */
5272 if (symtab_sec->sh_link >= elf_header.e_shnum)
5273 {
5274 strtab_sec = NULL;
5275 if (strtab)
5276 free (strtab);
5277 strtab = NULL;
5278 strtab_size = 0;
5279 }
5280 else if (strtab_sec
5281 != (sec = section_headers + symtab_sec->sh_link))
5282 {
5283 strtab_sec = sec;
5284 if (strtab)
5285 free (strtab);
5286 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5287 1, strtab_sec->sh_size,
5288 _("string table"));
5289 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5290 }
5291 group_name = sym->st_name < strtab_size
5292 ? strtab + sym->st_name : _("<corrupt>");
5293 }
5294
5295 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5296 1, section->sh_size,
5297 _("section data"));
5298 if (start == NULL)
5299 continue;
5300
5301 indices = start;
5302 size = (section->sh_size / section->sh_entsize) - 1;
5303 entry = byte_get (indices, 4);
5304 indices += 4;
5305
5306 if (do_section_groups)
5307 {
5308 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5309 get_group_flags (entry), i, name, group_name, size);
5310
5311 printf (_(" [Index] Name\n"));
5312 }
5313
5314 group->group_index = i;
5315
5316 for (j = 0; j < size; j++)
5317 {
5318 struct group_list * g;
5319
5320 entry = byte_get (indices, 4);
5321 indices += 4;
5322
5323 if (entry >= elf_header.e_shnum)
5324 {
5325 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5326 entry, i, elf_header.e_shnum - 1);
5327 continue;
5328 }
5329
5330 if (section_headers_groups [entry] != NULL)
5331 {
5332 if (entry)
5333 {
5334 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5335 entry, i,
5336 section_headers_groups [entry]->group_index);
5337 continue;
5338 }
5339 else
5340 {
5341 /* Intel C/C++ compiler may put section 0 in a
5342 section group. We just warn it the first time
5343 and ignore it afterwards. */
5344 static int warned = 0;
5345 if (!warned)
5346 {
5347 error (_("section 0 in group section [%5u]\n"),
5348 section_headers_groups [entry]->group_index);
5349 warned++;
5350 }
5351 }
5352 }
5353
5354 section_headers_groups [entry] = group;
5355
5356 if (do_section_groups)
5357 {
5358 sec = section_headers + entry;
5359 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5360 }
5361
5362 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5363 g->section_index = entry;
5364 g->next = group->root;
5365 group->root = g;
5366 }
5367
5368 if (start)
5369 free (start);
5370
5371 group++;
5372 }
5373 }
5374
5375 if (symtab)
5376 free (symtab);
5377 if (strtab)
5378 free (strtab);
5379 return 1;
5380 }
5381
5382 /* Data used to display dynamic fixups. */
5383
5384 struct ia64_vms_dynfixup
5385 {
5386 bfd_vma needed_ident; /* Library ident number. */
5387 bfd_vma needed; /* Index in the dstrtab of the library name. */
5388 bfd_vma fixup_needed; /* Index of the library. */
5389 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5390 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5391 };
5392
5393 /* Data used to display dynamic relocations. */
5394
5395 struct ia64_vms_dynimgrela
5396 {
5397 bfd_vma img_rela_cnt; /* Number of relocations. */
5398 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5399 };
5400
5401 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5402 library). */
5403
5404 static void
5405 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5406 const char *strtab, unsigned int strtab_sz)
5407 {
5408 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5409 long i;
5410 const char *lib_name;
5411
5412 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5413 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5414 _("dynamic section image fixups"));
5415 if (!imfs)
5416 return;
5417
5418 if (fixup->needed < strtab_sz)
5419 lib_name = strtab + fixup->needed;
5420 else
5421 {
5422 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5423 (unsigned long) fixup->needed);
5424 lib_name = "???";
5425 }
5426 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5427 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5428 printf
5429 (_("Seg Offset Type SymVec DataType\n"));
5430
5431 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5432 {
5433 unsigned int type;
5434 const char *rtype;
5435
5436 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5437 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5438 type = BYTE_GET (imfs [i].type);
5439 rtype = elf_ia64_reloc_type (type);
5440 if (rtype == NULL)
5441 printf (" 0x%08x ", type);
5442 else
5443 printf (" %-32s ", rtype);
5444 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5445 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5446 }
5447
5448 free (imfs);
5449 }
5450
5451 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5452
5453 static void
5454 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5455 {
5456 Elf64_External_VMS_IMAGE_RELA *imrs;
5457 long i;
5458
5459 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5460 1, imgrela->img_rela_cnt * sizeof (*imrs),
5461 _("dynamic section image relocations"));
5462 if (!imrs)
5463 return;
5464
5465 printf (_("\nImage relocs\n"));
5466 printf
5467 (_("Seg Offset Type Addend Seg Sym Off\n"));
5468
5469 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5470 {
5471 unsigned int type;
5472 const char *rtype;
5473
5474 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5475 printf ("%08" BFD_VMA_FMT "x ",
5476 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5477 type = BYTE_GET (imrs [i].type);
5478 rtype = elf_ia64_reloc_type (type);
5479 if (rtype == NULL)
5480 printf ("0x%08x ", type);
5481 else
5482 printf ("%-31s ", rtype);
5483 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5484 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5485 printf ("%08" BFD_VMA_FMT "x\n",
5486 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5487 }
5488
5489 free (imrs);
5490 }
5491
5492 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5493
5494 static int
5495 process_ia64_vms_dynamic_relocs (FILE *file)
5496 {
5497 struct ia64_vms_dynfixup fixup;
5498 struct ia64_vms_dynimgrela imgrela;
5499 Elf_Internal_Dyn *entry;
5500 int res = 0;
5501 bfd_vma strtab_off = 0;
5502 bfd_vma strtab_sz = 0;
5503 char *strtab = NULL;
5504
5505 memset (&fixup, 0, sizeof (fixup));
5506 memset (&imgrela, 0, sizeof (imgrela));
5507
5508 /* Note: the order of the entries is specified by the OpenVMS specs. */
5509 for (entry = dynamic_section;
5510 entry < dynamic_section + dynamic_nent;
5511 entry++)
5512 {
5513 switch (entry->d_tag)
5514 {
5515 case DT_IA_64_VMS_STRTAB_OFFSET:
5516 strtab_off = entry->d_un.d_val;
5517 break;
5518 case DT_STRSZ:
5519 strtab_sz = entry->d_un.d_val;
5520 if (strtab == NULL)
5521 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5522 1, strtab_sz, _("dynamic string section"));
5523 break;
5524
5525 case DT_IA_64_VMS_NEEDED_IDENT:
5526 fixup.needed_ident = entry->d_un.d_val;
5527 break;
5528 case DT_NEEDED:
5529 fixup.needed = entry->d_un.d_val;
5530 break;
5531 case DT_IA_64_VMS_FIXUP_NEEDED:
5532 fixup.fixup_needed = entry->d_un.d_val;
5533 break;
5534 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5535 fixup.fixup_rela_cnt = entry->d_un.d_val;
5536 break;
5537 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5538 fixup.fixup_rela_off = entry->d_un.d_val;
5539 res++;
5540 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5541 break;
5542
5543 case DT_IA_64_VMS_IMG_RELA_CNT:
5544 imgrela.img_rela_cnt = entry->d_un.d_val;
5545 break;
5546 case DT_IA_64_VMS_IMG_RELA_OFF:
5547 imgrela.img_rela_off = entry->d_un.d_val;
5548 res++;
5549 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5550 break;
5551
5552 default:
5553 break;
5554 }
5555 }
5556
5557 if (strtab != NULL)
5558 free (strtab);
5559
5560 return res;
5561 }
5562
5563 static struct
5564 {
5565 const char * name;
5566 int reloc;
5567 int size;
5568 int rela;
5569 } dynamic_relocations [] =
5570 {
5571 { "REL", DT_REL, DT_RELSZ, FALSE },
5572 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5573 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5574 };
5575
5576 /* Process the reloc section. */
5577
5578 static int
5579 process_relocs (FILE * file)
5580 {
5581 unsigned long rel_size;
5582 unsigned long rel_offset;
5583
5584
5585 if (!do_reloc)
5586 return 1;
5587
5588 if (do_using_dynamic)
5589 {
5590 int is_rela;
5591 const char * name;
5592 int has_dynamic_reloc;
5593 unsigned int i;
5594
5595 has_dynamic_reloc = 0;
5596
5597 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5598 {
5599 is_rela = dynamic_relocations [i].rela;
5600 name = dynamic_relocations [i].name;
5601 rel_size = dynamic_info [dynamic_relocations [i].size];
5602 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5603
5604 has_dynamic_reloc |= rel_size;
5605
5606 if (is_rela == UNKNOWN)
5607 {
5608 if (dynamic_relocations [i].reloc == DT_JMPREL)
5609 switch (dynamic_info[DT_PLTREL])
5610 {
5611 case DT_REL:
5612 is_rela = FALSE;
5613 break;
5614 case DT_RELA:
5615 is_rela = TRUE;
5616 break;
5617 }
5618 }
5619
5620 if (rel_size)
5621 {
5622 printf
5623 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5624 name, rel_offset, rel_size);
5625
5626 dump_relocations (file,
5627 offset_from_vma (file, rel_offset, rel_size),
5628 rel_size,
5629 dynamic_symbols, num_dynamic_syms,
5630 dynamic_strings, dynamic_strings_length, is_rela);
5631 }
5632 }
5633
5634 if (is_ia64_vms ())
5635 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5636
5637 if (! has_dynamic_reloc)
5638 printf (_("\nThere are no dynamic relocations in this file.\n"));
5639 }
5640 else
5641 {
5642 Elf_Internal_Shdr * section;
5643 unsigned long i;
5644 int found = 0;
5645
5646 for (i = 0, section = section_headers;
5647 i < elf_header.e_shnum;
5648 i++, section++)
5649 {
5650 if ( section->sh_type != SHT_RELA
5651 && section->sh_type != SHT_REL)
5652 continue;
5653
5654 rel_offset = section->sh_offset;
5655 rel_size = section->sh_size;
5656
5657 if (rel_size)
5658 {
5659 Elf_Internal_Shdr * strsec;
5660 int is_rela;
5661
5662 printf (_("\nRelocation section "));
5663
5664 if (string_table == NULL)
5665 printf ("%d", section->sh_name);
5666 else
5667 printf ("'%s'", SECTION_NAME (section));
5668
5669 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5670 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5671
5672 is_rela = section->sh_type == SHT_RELA;
5673
5674 if (section->sh_link != 0
5675 && section->sh_link < elf_header.e_shnum)
5676 {
5677 Elf_Internal_Shdr * symsec;
5678 Elf_Internal_Sym * symtab;
5679 unsigned long nsyms;
5680 unsigned long strtablen = 0;
5681 char * strtab = NULL;
5682
5683 symsec = section_headers + section->sh_link;
5684 if (symsec->sh_type != SHT_SYMTAB
5685 && symsec->sh_type != SHT_DYNSYM)
5686 continue;
5687
5688 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
5689
5690 if (symtab == NULL)
5691 continue;
5692
5693 if (symsec->sh_link != 0
5694 && symsec->sh_link < elf_header.e_shnum)
5695 {
5696 strsec = section_headers + symsec->sh_link;
5697
5698 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5699 1, strsec->sh_size,
5700 _("string table"));
5701 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5702 }
5703
5704 dump_relocations (file, rel_offset, rel_size,
5705 symtab, nsyms, strtab, strtablen, is_rela);
5706 if (strtab)
5707 free (strtab);
5708 free (symtab);
5709 }
5710 else
5711 dump_relocations (file, rel_offset, rel_size,
5712 NULL, 0, NULL, 0, is_rela);
5713
5714 found = 1;
5715 }
5716 }
5717
5718 if (! found)
5719 printf (_("\nThere are no relocations in this file.\n"));
5720 }
5721
5722 return 1;
5723 }
5724
5725 /* Process the unwind section. */
5726
5727 #include "unwind-ia64.h"
5728
5729 /* An absolute address consists of a section and an offset. If the
5730 section is NULL, the offset itself is the address, otherwise, the
5731 address equals to LOAD_ADDRESS(section) + offset. */
5732
5733 struct absaddr
5734 {
5735 unsigned short section;
5736 bfd_vma offset;
5737 };
5738
5739 #define ABSADDR(a) \
5740 ((a).section \
5741 ? section_headers [(a).section].sh_addr + (a).offset \
5742 : (a).offset)
5743
5744 struct ia64_unw_table_entry
5745 {
5746 struct absaddr start;
5747 struct absaddr end;
5748 struct absaddr info;
5749 };
5750
5751 struct ia64_unw_aux_info
5752 {
5753
5754 struct ia64_unw_table_entry *table; /* Unwind table. */
5755 unsigned long table_len; /* Length of unwind table. */
5756 unsigned char * info; /* Unwind info. */
5757 unsigned long info_size; /* Size of unwind info. */
5758 bfd_vma info_addr; /* starting address of unwind info. */
5759 bfd_vma seg_base; /* Starting address of segment. */
5760 Elf_Internal_Sym * symtab; /* The symbol table. */
5761 unsigned long nsyms; /* Number of symbols. */
5762 char * strtab; /* The string table. */
5763 unsigned long strtab_size; /* Size of string table. */
5764 };
5765
5766 static void
5767 find_symbol_for_address (Elf_Internal_Sym * symtab,
5768 unsigned long nsyms,
5769 const char * strtab,
5770 unsigned long strtab_size,
5771 struct absaddr addr,
5772 const char ** symname,
5773 bfd_vma * offset)
5774 {
5775 bfd_vma dist = 0x100000;
5776 Elf_Internal_Sym * sym;
5777 Elf_Internal_Sym * best = NULL;
5778 unsigned long i;
5779
5780 REMOVE_ARCH_BITS (addr.offset);
5781
5782 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5783 {
5784 bfd_vma value = sym->st_value;
5785
5786 REMOVE_ARCH_BITS (value);
5787
5788 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5789 && sym->st_name != 0
5790 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5791 && addr.offset >= value
5792 && addr.offset - value < dist)
5793 {
5794 best = sym;
5795 dist = addr.offset - value;
5796 if (!dist)
5797 break;
5798 }
5799 }
5800
5801 if (best)
5802 {
5803 *symname = (best->st_name >= strtab_size
5804 ? _("<corrupt>") : strtab + best->st_name);
5805 *offset = dist;
5806 return;
5807 }
5808
5809 *symname = NULL;
5810 *offset = addr.offset;
5811 }
5812
5813 static void
5814 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5815 {
5816 struct ia64_unw_table_entry * tp;
5817 int in_body;
5818
5819 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5820 {
5821 bfd_vma stamp;
5822 bfd_vma offset;
5823 const unsigned char * dp;
5824 const unsigned char * head;
5825 const char * procname;
5826
5827 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5828 aux->strtab_size, tp->start, &procname, &offset);
5829
5830 fputs ("\n<", stdout);
5831
5832 if (procname)
5833 {
5834 fputs (procname, stdout);
5835
5836 if (offset)
5837 printf ("+%lx", (unsigned long) offset);
5838 }
5839
5840 fputs (">: [", stdout);
5841 print_vma (tp->start.offset, PREFIX_HEX);
5842 fputc ('-', stdout);
5843 print_vma (tp->end.offset, PREFIX_HEX);
5844 printf ("], info at +0x%lx\n",
5845 (unsigned long) (tp->info.offset - aux->seg_base));
5846
5847 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5848 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5849
5850 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5851 (unsigned) UNW_VER (stamp),
5852 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5853 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5854 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5855 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5856
5857 if (UNW_VER (stamp) != 1)
5858 {
5859 printf (_("\tUnknown version.\n"));
5860 continue;
5861 }
5862
5863 in_body = 0;
5864 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5865 dp = unw_decode (dp, in_body, & in_body);
5866 }
5867 }
5868
5869 static int
5870 slurp_ia64_unwind_table (FILE * file,
5871 struct ia64_unw_aux_info * aux,
5872 Elf_Internal_Shdr * sec)
5873 {
5874 unsigned long size, nrelas, i;
5875 Elf_Internal_Phdr * seg;
5876 struct ia64_unw_table_entry * tep;
5877 Elf_Internal_Shdr * relsec;
5878 Elf_Internal_Rela * rela;
5879 Elf_Internal_Rela * rp;
5880 unsigned char * table;
5881 unsigned char * tp;
5882 Elf_Internal_Sym * sym;
5883 const char * relname;
5884
5885 /* First, find the starting address of the segment that includes
5886 this section: */
5887
5888 if (elf_header.e_phnum)
5889 {
5890 if (! get_program_headers (file))
5891 return 0;
5892
5893 for (seg = program_headers;
5894 seg < program_headers + elf_header.e_phnum;
5895 ++seg)
5896 {
5897 if (seg->p_type != PT_LOAD)
5898 continue;
5899
5900 if (sec->sh_addr >= seg->p_vaddr
5901 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5902 {
5903 aux->seg_base = seg->p_vaddr;
5904 break;
5905 }
5906 }
5907 }
5908
5909 /* Second, build the unwind table from the contents of the unwind section: */
5910 size = sec->sh_size;
5911 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5912 _("unwind table"));
5913 if (!table)
5914 return 0;
5915
5916 aux->table = (struct ia64_unw_table_entry *)
5917 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5918 tep = aux->table;
5919 for (tp = table; tp < table + size; ++tep)
5920 {
5921 tep->start.section = SHN_UNDEF;
5922 tep->end.section = SHN_UNDEF;
5923 tep->info.section = SHN_UNDEF;
5924 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5925 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5926 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5927 tep->start.offset += aux->seg_base;
5928 tep->end.offset += aux->seg_base;
5929 tep->info.offset += aux->seg_base;
5930 }
5931 free (table);
5932
5933 /* Third, apply any relocations to the unwind table: */
5934 for (relsec = section_headers;
5935 relsec < section_headers + elf_header.e_shnum;
5936 ++relsec)
5937 {
5938 if (relsec->sh_type != SHT_RELA
5939 || relsec->sh_info >= elf_header.e_shnum
5940 || section_headers + relsec->sh_info != sec)
5941 continue;
5942
5943 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5944 & rela, & nrelas))
5945 return 0;
5946
5947 for (rp = rela; rp < rela + nrelas; ++rp)
5948 {
5949 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5950 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5951
5952 if (! const_strneq (relname, "R_IA64_SEGREL"))
5953 {
5954 warn (_("Skipping unexpected relocation type %s\n"), relname);
5955 continue;
5956 }
5957
5958 i = rp->r_offset / (3 * eh_addr_size);
5959
5960 switch (rp->r_offset/eh_addr_size % 3)
5961 {
5962 case 0:
5963 aux->table[i].start.section = sym->st_shndx;
5964 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5965 break;
5966 case 1:
5967 aux->table[i].end.section = sym->st_shndx;
5968 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5969 break;
5970 case 2:
5971 aux->table[i].info.section = sym->st_shndx;
5972 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5973 break;
5974 default:
5975 break;
5976 }
5977 }
5978
5979 free (rela);
5980 }
5981
5982 aux->table_len = size / (3 * eh_addr_size);
5983 return 1;
5984 }
5985
5986 static void
5987 ia64_process_unwind (FILE * file)
5988 {
5989 Elf_Internal_Shdr * sec;
5990 Elf_Internal_Shdr * unwsec = NULL;
5991 Elf_Internal_Shdr * strsec;
5992 unsigned long i, unwcount = 0, unwstart = 0;
5993 struct ia64_unw_aux_info aux;
5994
5995 memset (& aux, 0, sizeof (aux));
5996
5997 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5998 {
5999 if (sec->sh_type == SHT_SYMTAB
6000 && sec->sh_link < elf_header.e_shnum)
6001 {
6002 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6003
6004 strsec = section_headers + sec->sh_link;
6005 assert (aux.strtab == NULL);
6006 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6007 1, strsec->sh_size,
6008 _("string table"));
6009 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6010 }
6011 else if (sec->sh_type == SHT_IA_64_UNWIND)
6012 unwcount++;
6013 }
6014
6015 if (!unwcount)
6016 printf (_("\nThere are no unwind sections in this file.\n"));
6017
6018 while (unwcount-- > 0)
6019 {
6020 char * suffix;
6021 size_t len, len2;
6022
6023 for (i = unwstart, sec = section_headers + unwstart;
6024 i < elf_header.e_shnum; ++i, ++sec)
6025 if (sec->sh_type == SHT_IA_64_UNWIND)
6026 {
6027 unwsec = sec;
6028 break;
6029 }
6030
6031 unwstart = i + 1;
6032 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6033
6034 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6035 {
6036 /* We need to find which section group it is in. */
6037 struct group_list * g = section_headers_groups [i]->root;
6038
6039 for (; g != NULL; g = g->next)
6040 {
6041 sec = section_headers + g->section_index;
6042
6043 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6044 break;
6045 }
6046
6047 if (g == NULL)
6048 i = elf_header.e_shnum;
6049 }
6050 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6051 {
6052 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6053 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6054 suffix = SECTION_NAME (unwsec) + len;
6055 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6056 ++i, ++sec)
6057 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6058 && streq (SECTION_NAME (sec) + len2, suffix))
6059 break;
6060 }
6061 else
6062 {
6063 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6064 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6065 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6066 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6067 suffix = "";
6068 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6069 suffix = SECTION_NAME (unwsec) + len;
6070 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6071 ++i, ++sec)
6072 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6073 && streq (SECTION_NAME (sec) + len2, suffix))
6074 break;
6075 }
6076
6077 if (i == elf_header.e_shnum)
6078 {
6079 printf (_("\nCould not find unwind info section for "));
6080
6081 if (string_table == NULL)
6082 printf ("%d", unwsec->sh_name);
6083 else
6084 printf (_("'%s'"), SECTION_NAME (unwsec));
6085 }
6086 else
6087 {
6088 aux.info_addr = sec->sh_addr;
6089 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6090 sec->sh_size,
6091 _("unwind info"));
6092 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6093
6094 printf (_("\nUnwind section "));
6095
6096 if (string_table == NULL)
6097 printf ("%d", unwsec->sh_name);
6098 else
6099 printf (_("'%s'"), SECTION_NAME (unwsec));
6100
6101 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6102 (unsigned long) unwsec->sh_offset,
6103 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6104
6105 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6106
6107 if (aux.table_len > 0)
6108 dump_ia64_unwind (& aux);
6109
6110 if (aux.table)
6111 free ((char *) aux.table);
6112 if (aux.info)
6113 free ((char *) aux.info);
6114 aux.table = NULL;
6115 aux.info = NULL;
6116 }
6117 }
6118
6119 if (aux.symtab)
6120 free (aux.symtab);
6121 if (aux.strtab)
6122 free ((char *) aux.strtab);
6123 }
6124
6125 struct hppa_unw_table_entry
6126 {
6127 struct absaddr start;
6128 struct absaddr end;
6129 unsigned int Cannot_unwind:1; /* 0 */
6130 unsigned int Millicode:1; /* 1 */
6131 unsigned int Millicode_save_sr0:1; /* 2 */
6132 unsigned int Region_description:2; /* 3..4 */
6133 unsigned int reserved1:1; /* 5 */
6134 unsigned int Entry_SR:1; /* 6 */
6135 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6136 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6137 unsigned int Args_stored:1; /* 16 */
6138 unsigned int Variable_Frame:1; /* 17 */
6139 unsigned int Separate_Package_Body:1; /* 18 */
6140 unsigned int Frame_Extension_Millicode:1; /* 19 */
6141 unsigned int Stack_Overflow_Check:1; /* 20 */
6142 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
6143 unsigned int Ada_Region:1; /* 22 */
6144 unsigned int cxx_info:1; /* 23 */
6145 unsigned int cxx_try_catch:1; /* 24 */
6146 unsigned int sched_entry_seq:1; /* 25 */
6147 unsigned int reserved2:1; /* 26 */
6148 unsigned int Save_SP:1; /* 27 */
6149 unsigned int Save_RP:1; /* 28 */
6150 unsigned int Save_MRP_in_frame:1; /* 29 */
6151 unsigned int extn_ptr_defined:1; /* 30 */
6152 unsigned int Cleanup_defined:1; /* 31 */
6153
6154 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6155 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6156 unsigned int Large_frame:1; /* 2 */
6157 unsigned int Pseudo_SP_Set:1; /* 3 */
6158 unsigned int reserved4:1; /* 4 */
6159 unsigned int Total_frame_size:27; /* 5..31 */
6160 };
6161
6162 struct hppa_unw_aux_info
6163 {
6164 struct hppa_unw_table_entry *table; /* Unwind table. */
6165 unsigned long table_len; /* Length of unwind table. */
6166 bfd_vma seg_base; /* Starting address of segment. */
6167 Elf_Internal_Sym * symtab; /* The symbol table. */
6168 unsigned long nsyms; /* Number of symbols. */
6169 char * strtab; /* The string table. */
6170 unsigned long strtab_size; /* Size of string table. */
6171 };
6172
6173 static void
6174 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6175 {
6176 struct hppa_unw_table_entry * tp;
6177
6178 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6179 {
6180 bfd_vma offset;
6181 const char * procname;
6182
6183 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6184 aux->strtab_size, tp->start, &procname,
6185 &offset);
6186
6187 fputs ("\n<", stdout);
6188
6189 if (procname)
6190 {
6191 fputs (procname, stdout);
6192
6193 if (offset)
6194 printf ("+%lx", (unsigned long) offset);
6195 }
6196
6197 fputs (">: [", stdout);
6198 print_vma (tp->start.offset, PREFIX_HEX);
6199 fputc ('-', stdout);
6200 print_vma (tp->end.offset, PREFIX_HEX);
6201 printf ("]\n\t");
6202
6203 #define PF(_m) if (tp->_m) printf (#_m " ");
6204 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6205 PF(Cannot_unwind);
6206 PF(Millicode);
6207 PF(Millicode_save_sr0);
6208 /* PV(Region_description); */
6209 PF(Entry_SR);
6210 PV(Entry_FR);
6211 PV(Entry_GR);
6212 PF(Args_stored);
6213 PF(Variable_Frame);
6214 PF(Separate_Package_Body);
6215 PF(Frame_Extension_Millicode);
6216 PF(Stack_Overflow_Check);
6217 PF(Two_Instruction_SP_Increment);
6218 PF(Ada_Region);
6219 PF(cxx_info);
6220 PF(cxx_try_catch);
6221 PF(sched_entry_seq);
6222 PF(Save_SP);
6223 PF(Save_RP);
6224 PF(Save_MRP_in_frame);
6225 PF(extn_ptr_defined);
6226 PF(Cleanup_defined);
6227 PF(MPE_XL_interrupt_marker);
6228 PF(HP_UX_interrupt_marker);
6229 PF(Large_frame);
6230 PF(Pseudo_SP_Set);
6231 PV(Total_frame_size);
6232 #undef PF
6233 #undef PV
6234 }
6235
6236 printf ("\n");
6237 }
6238
6239 static int
6240 slurp_hppa_unwind_table (FILE * file,
6241 struct hppa_unw_aux_info * aux,
6242 Elf_Internal_Shdr * sec)
6243 {
6244 unsigned long size, unw_ent_size, nentries, nrelas, i;
6245 Elf_Internal_Phdr * seg;
6246 struct hppa_unw_table_entry * tep;
6247 Elf_Internal_Shdr * relsec;
6248 Elf_Internal_Rela * rela;
6249 Elf_Internal_Rela * rp;
6250 unsigned char * table;
6251 unsigned char * tp;
6252 Elf_Internal_Sym * sym;
6253 const char * relname;
6254
6255 /* First, find the starting address of the segment that includes
6256 this section. */
6257
6258 if (elf_header.e_phnum)
6259 {
6260 if (! get_program_headers (file))
6261 return 0;
6262
6263 for (seg = program_headers;
6264 seg < program_headers + elf_header.e_phnum;
6265 ++seg)
6266 {
6267 if (seg->p_type != PT_LOAD)
6268 continue;
6269
6270 if (sec->sh_addr >= seg->p_vaddr
6271 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6272 {
6273 aux->seg_base = seg->p_vaddr;
6274 break;
6275 }
6276 }
6277 }
6278
6279 /* Second, build the unwind table from the contents of the unwind
6280 section. */
6281 size = sec->sh_size;
6282 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6283 _("unwind table"));
6284 if (!table)
6285 return 0;
6286
6287 unw_ent_size = 16;
6288 nentries = size / unw_ent_size;
6289 size = unw_ent_size * nentries;
6290
6291 tep = aux->table = (struct hppa_unw_table_entry *)
6292 xcmalloc (nentries, sizeof (aux->table[0]));
6293
6294 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6295 {
6296 unsigned int tmp1, tmp2;
6297
6298 tep->start.section = SHN_UNDEF;
6299 tep->end.section = SHN_UNDEF;
6300
6301 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6302 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6303 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6304 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6305
6306 tep->start.offset += aux->seg_base;
6307 tep->end.offset += aux->seg_base;
6308
6309 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6310 tep->Millicode = (tmp1 >> 30) & 0x1;
6311 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6312 tep->Region_description = (tmp1 >> 27) & 0x3;
6313 tep->reserved1 = (tmp1 >> 26) & 0x1;
6314 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6315 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6316 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6317 tep->Args_stored = (tmp1 >> 15) & 0x1;
6318 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6319 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6320 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6321 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6322 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6323 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6324 tep->cxx_info = (tmp1 >> 8) & 0x1;
6325 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6326 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6327 tep->reserved2 = (tmp1 >> 5) & 0x1;
6328 tep->Save_SP = (tmp1 >> 4) & 0x1;
6329 tep->Save_RP = (tmp1 >> 3) & 0x1;
6330 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6331 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6332 tep->Cleanup_defined = tmp1 & 0x1;
6333
6334 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6335 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6336 tep->Large_frame = (tmp2 >> 29) & 0x1;
6337 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6338 tep->reserved4 = (tmp2 >> 27) & 0x1;
6339 tep->Total_frame_size = tmp2 & 0x7ffffff;
6340 }
6341 free (table);
6342
6343 /* Third, apply any relocations to the unwind table. */
6344 for (relsec = section_headers;
6345 relsec < section_headers + elf_header.e_shnum;
6346 ++relsec)
6347 {
6348 if (relsec->sh_type != SHT_RELA
6349 || relsec->sh_info >= elf_header.e_shnum
6350 || section_headers + relsec->sh_info != sec)
6351 continue;
6352
6353 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6354 & rela, & nrelas))
6355 return 0;
6356
6357 for (rp = rela; rp < rela + nrelas; ++rp)
6358 {
6359 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6360 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6361
6362 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6363 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6364 {
6365 warn (_("Skipping unexpected relocation type %s\n"), relname);
6366 continue;
6367 }
6368
6369 i = rp->r_offset / unw_ent_size;
6370
6371 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6372 {
6373 case 0:
6374 aux->table[i].start.section = sym->st_shndx;
6375 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6376 break;
6377 case 1:
6378 aux->table[i].end.section = sym->st_shndx;
6379 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6380 break;
6381 default:
6382 break;
6383 }
6384 }
6385
6386 free (rela);
6387 }
6388
6389 aux->table_len = nentries;
6390
6391 return 1;
6392 }
6393
6394 static void
6395 hppa_process_unwind (FILE * file)
6396 {
6397 struct hppa_unw_aux_info aux;
6398 Elf_Internal_Shdr * unwsec = NULL;
6399 Elf_Internal_Shdr * strsec;
6400 Elf_Internal_Shdr * sec;
6401 unsigned long i;
6402
6403 if (string_table == NULL)
6404 return;
6405
6406 memset (& aux, 0, sizeof (aux));
6407
6408 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6409 {
6410 if (sec->sh_type == SHT_SYMTAB
6411 && sec->sh_link < elf_header.e_shnum)
6412 {
6413 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6414
6415 strsec = section_headers + sec->sh_link;
6416 assert (aux.strtab == NULL);
6417 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6418 1, strsec->sh_size,
6419 _("string table"));
6420 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6421 }
6422 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6423 unwsec = sec;
6424 }
6425
6426 if (!unwsec)
6427 printf (_("\nThere are no unwind sections in this file.\n"));
6428
6429 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6430 {
6431 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6432 {
6433 printf (_("\nUnwind section "));
6434 printf (_("'%s'"), SECTION_NAME (sec));
6435
6436 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6437 (unsigned long) sec->sh_offset,
6438 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6439
6440 slurp_hppa_unwind_table (file, &aux, sec);
6441 if (aux.table_len > 0)
6442 dump_hppa_unwind (&aux);
6443
6444 if (aux.table)
6445 free ((char *) aux.table);
6446 aux.table = NULL;
6447 }
6448 }
6449
6450 if (aux.symtab)
6451 free (aux.symtab);
6452 if (aux.strtab)
6453 free ((char *) aux.strtab);
6454 }
6455
6456 struct arm_section
6457 {
6458 unsigned char * data; /* The unwind data. */
6459 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
6460 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
6461 unsigned long nrelas; /* The number of relocations. */
6462 unsigned int rel_type; /* REL or RELA ? */
6463 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
6464 };
6465
6466 struct arm_unw_aux_info
6467 {
6468 FILE * file; /* The file containing the unwind sections. */
6469 Elf_Internal_Sym * symtab; /* The file's symbol table. */
6470 unsigned long nsyms; /* Number of symbols. */
6471 char * strtab; /* The file's string table. */
6472 unsigned long strtab_size; /* Size of string table. */
6473 };
6474
6475 static const char *
6476 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6477 bfd_vma fn, struct absaddr addr)
6478 {
6479 const char *procname;
6480 bfd_vma sym_offset;
6481
6482 if (addr.section == SHN_UNDEF)
6483 addr.offset = fn;
6484
6485 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6486 aux->strtab_size, addr, &procname,
6487 &sym_offset);
6488
6489 print_vma (fn, PREFIX_HEX);
6490
6491 if (procname)
6492 {
6493 fputs (" <", stdout);
6494 fputs (procname, stdout);
6495
6496 if (sym_offset)
6497 printf ("+0x%lx", (unsigned long) sym_offset);
6498 fputc ('>', stdout);
6499 }
6500
6501 return procname;
6502 }
6503
6504 static void
6505 arm_free_section (struct arm_section *arm_sec)
6506 {
6507 if (arm_sec->data != NULL)
6508 free (arm_sec->data);
6509
6510 if (arm_sec->rela != NULL)
6511 free (arm_sec->rela);
6512 }
6513
6514 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6515 cached section and install SEC instead.
6516 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6517 and return its valued in * WORDP, relocating if necessary.
6518 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6519 relocation's offset in ADDR.
6520 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6521 into the string table of the symbol associated with the reloc. If no
6522 reloc was applied store -1 there.
6523 5) Return TRUE upon success, FALSE otherwise. */
6524
6525 static bfd_boolean
6526 get_unwind_section_word (struct arm_unw_aux_info * aux,
6527 struct arm_section * arm_sec,
6528 Elf_Internal_Shdr * sec,
6529 bfd_vma word_offset,
6530 unsigned int * wordp,
6531 struct absaddr * addr,
6532 bfd_vma * sym_name)
6533 {
6534 Elf_Internal_Rela *rp;
6535 Elf_Internal_Sym *sym;
6536 const char * relname;
6537 unsigned int word;
6538 bfd_boolean wrapped;
6539
6540 addr->section = SHN_UNDEF;
6541 addr->offset = 0;
6542
6543 if (sym_name != NULL)
6544 *sym_name = (bfd_vma) -1;
6545
6546 /* If necessary, update the section cache. */
6547 if (sec != arm_sec->sec)
6548 {
6549 Elf_Internal_Shdr *relsec;
6550
6551 arm_free_section (arm_sec);
6552
6553 arm_sec->sec = sec;
6554 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6555 sec->sh_size, _("unwind data"));
6556 arm_sec->rela = NULL;
6557 arm_sec->nrelas = 0;
6558
6559 for (relsec = section_headers;
6560 relsec < section_headers + elf_header.e_shnum;
6561 ++relsec)
6562 {
6563 if (relsec->sh_info >= elf_header.e_shnum
6564 || section_headers + relsec->sh_info != sec)
6565 continue;
6566
6567 arm_sec->rel_type = relsec->sh_type;
6568 if (relsec->sh_type == SHT_REL)
6569 {
6570 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6571 relsec->sh_size,
6572 & arm_sec->rela, & arm_sec->nrelas))
6573 return FALSE;
6574 break;
6575 }
6576 else if (relsec->sh_type == SHT_RELA)
6577 {
6578 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6579 relsec->sh_size,
6580 & arm_sec->rela, & arm_sec->nrelas))
6581 return FALSE;
6582 break;
6583 }
6584 else
6585 warn (_("unexpected relocation type (%d) for section %d"),
6586 relsec->sh_type, relsec->sh_info);
6587 }
6588
6589 arm_sec->next_rela = arm_sec->rela;
6590 }
6591
6592 /* If there is no unwind data we can do nothing. */
6593 if (arm_sec->data == NULL)
6594 return FALSE;
6595
6596 /* Get the word at the required offset. */
6597 word = byte_get (arm_sec->data + word_offset, 4);
6598
6599 /* Look through the relocs to find the one that applies to the provided offset. */
6600 wrapped = FALSE;
6601 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6602 {
6603 bfd_vma prelval, offset;
6604
6605 if (rp->r_offset > word_offset && !wrapped)
6606 {
6607 rp = arm_sec->rela;
6608 wrapped = TRUE;
6609 }
6610 if (rp->r_offset > word_offset)
6611 break;
6612
6613 if (rp->r_offset & 3)
6614 {
6615 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6616 (unsigned long) rp->r_offset);
6617 continue;
6618 }
6619
6620 if (rp->r_offset < word_offset)
6621 continue;
6622
6623 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6624
6625 if (arm_sec->rel_type == SHT_REL)
6626 {
6627 offset = word & 0x7fffffff;
6628 if (offset & 0x40000000)
6629 offset |= ~ (bfd_vma) 0x7fffffff;
6630 }
6631 else if (arm_sec->rel_type == SHT_RELA)
6632 offset = rp->r_addend;
6633 else
6634 abort ();
6635
6636 offset += sym->st_value;
6637 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6638
6639 /* Check that we are processing the expected reloc type. */
6640 if (elf_header.e_machine == EM_ARM)
6641 {
6642 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6643
6644 if (streq (relname, "R_ARM_NONE"))
6645 continue;
6646
6647 if (! streq (relname, "R_ARM_PREL31"))
6648 {
6649 warn (_("Skipping unexpected relocation type %s\n"), relname);
6650 continue;
6651 }
6652 }
6653 else if (elf_header.e_machine == EM_TI_C6000)
6654 {
6655 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6656
6657 if (streq (relname, "R_C6000_NONE"))
6658 continue;
6659
6660 if (! streq (relname, "R_C6000_PREL31"))
6661 {
6662 warn (_("Skipping unexpected relocation type %s\n"), relname);
6663 continue;
6664 }
6665
6666 prelval >>= 1;
6667 }
6668 else
6669 /* This function currently only supports ARM and TI unwinders. */
6670 abort ();
6671
6672 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6673 addr->section = sym->st_shndx;
6674 addr->offset = offset;
6675 if (sym_name)
6676 * sym_name = sym->st_name;
6677 break;
6678 }
6679
6680 *wordp = word;
6681 arm_sec->next_rela = rp;
6682
6683 return TRUE;
6684 }
6685
6686 static const char *tic6x_unwind_regnames[16] =
6687 {
6688 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6689 "A14", "A13", "A12", "A11", "A10",
6690 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
6691 };
6692
6693 static void
6694 decode_tic6x_unwind_regmask (unsigned int mask)
6695 {
6696 int i;
6697
6698 for (i = 12; mask; mask >>= 1, i--)
6699 {
6700 if (mask & 1)
6701 {
6702 fputs (tic6x_unwind_regnames[i], stdout);
6703 if (mask > 1)
6704 fputs (", ", stdout);
6705 }
6706 }
6707 }
6708
6709 #define ADVANCE \
6710 if (remaining == 0 && more_words) \
6711 { \
6712 data_offset += 4; \
6713 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
6714 data_offset, & word, & addr, NULL)) \
6715 return; \
6716 remaining = 4; \
6717 more_words--; \
6718 } \
6719
6720 #define GET_OP(OP) \
6721 ADVANCE; \
6722 if (remaining) \
6723 { \
6724 remaining--; \
6725 (OP) = word >> 24; \
6726 word <<= 8; \
6727 } \
6728 else \
6729 { \
6730 printf (_("[Truncated opcode]\n")); \
6731 return; \
6732 } \
6733 printf ("0x%02x ", OP)
6734
6735 static void
6736 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6737 unsigned int word, unsigned int remaining,
6738 unsigned int more_words,
6739 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6740 struct arm_section *data_arm_sec)
6741 {
6742 struct absaddr addr;
6743
6744 /* Decode the unwinding instructions. */
6745 while (1)
6746 {
6747 unsigned int op, op2;
6748
6749 ADVANCE;
6750 if (remaining == 0)
6751 break;
6752 remaining--;
6753 op = word >> 24;
6754 word <<= 8;
6755
6756 printf (" 0x%02x ", op);
6757
6758 if ((op & 0xc0) == 0x00)
6759 {
6760 int offset = ((op & 0x3f) << 2) + 4;
6761
6762 printf (" vsp = vsp + %d", offset);
6763 }
6764 else if ((op & 0xc0) == 0x40)
6765 {
6766 int offset = ((op & 0x3f) << 2) + 4;
6767
6768 printf (" vsp = vsp - %d", offset);
6769 }
6770 else if ((op & 0xf0) == 0x80)
6771 {
6772 GET_OP (op2);
6773 if (op == 0x80 && op2 == 0)
6774 printf (_("Refuse to unwind"));
6775 else
6776 {
6777 unsigned int mask = ((op & 0x0f) << 8) | op2;
6778 int first = 1;
6779 int i;
6780
6781 printf ("pop {");
6782 for (i = 0; i < 12; i++)
6783 if (mask & (1 << i))
6784 {
6785 if (first)
6786 first = 0;
6787 else
6788 printf (", ");
6789 printf ("r%d", 4 + i);
6790 }
6791 printf ("}");
6792 }
6793 }
6794 else if ((op & 0xf0) == 0x90)
6795 {
6796 if (op == 0x9d || op == 0x9f)
6797 printf (_(" [Reserved]"));
6798 else
6799 printf (" vsp = r%d", op & 0x0f);
6800 }
6801 else if ((op & 0xf0) == 0xa0)
6802 {
6803 int end = 4 + (op & 0x07);
6804 int first = 1;
6805 int i;
6806
6807 printf (" pop {");
6808 for (i = 4; i <= end; i++)
6809 {
6810 if (first)
6811 first = 0;
6812 else
6813 printf (", ");
6814 printf ("r%d", i);
6815 }
6816 if (op & 0x08)
6817 {
6818 if (!first)
6819 printf (", ");
6820 printf ("r14");
6821 }
6822 printf ("}");
6823 }
6824 else if (op == 0xb0)
6825 printf (_(" finish"));
6826 else if (op == 0xb1)
6827 {
6828 GET_OP (op2);
6829 if (op2 == 0 || (op2 & 0xf0) != 0)
6830 printf (_("[Spare]"));
6831 else
6832 {
6833 unsigned int mask = op2 & 0x0f;
6834 int first = 1;
6835 int i;
6836
6837 printf ("pop {");
6838 for (i = 0; i < 12; i++)
6839 if (mask & (1 << i))
6840 {
6841 if (first)
6842 first = 0;
6843 else
6844 printf (", ");
6845 printf ("r%d", i);
6846 }
6847 printf ("}");
6848 }
6849 }
6850 else if (op == 0xb2)
6851 {
6852 unsigned char buf[9];
6853 unsigned int i, len;
6854 unsigned long offset;
6855
6856 for (i = 0; i < sizeof (buf); i++)
6857 {
6858 GET_OP (buf[i]);
6859 if ((buf[i] & 0x80) == 0)
6860 break;
6861 }
6862 assert (i < sizeof (buf));
6863 offset = read_uleb128 (buf, &len);
6864 assert (len == i + 1);
6865 offset = offset * 4 + 0x204;
6866 printf ("vsp = vsp + %ld", offset);
6867 }
6868 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6869 {
6870 unsigned int first, last;
6871
6872 GET_OP (op2);
6873 first = op2 >> 4;
6874 last = op2 & 0x0f;
6875 if (op == 0xc8)
6876 first = first + 16;
6877 printf ("pop {D%d", first);
6878 if (last)
6879 printf ("-D%d", first + last);
6880 printf ("}");
6881 }
6882 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6883 {
6884 unsigned int count = op & 0x07;
6885
6886 printf ("pop {D8");
6887 if (count)
6888 printf ("-D%d", 8 + count);
6889 printf ("}");
6890 }
6891 else if (op >= 0xc0 && op <= 0xc5)
6892 {
6893 unsigned int count = op & 0x07;
6894
6895 printf (" pop {wR10");
6896 if (count)
6897 printf ("-wR%d", 10 + count);
6898 printf ("}");
6899 }
6900 else if (op == 0xc6)
6901 {
6902 unsigned int first, last;
6903
6904 GET_OP (op2);
6905 first = op2 >> 4;
6906 last = op2 & 0x0f;
6907 printf ("pop {wR%d", first);
6908 if (last)
6909 printf ("-wR%d", first + last);
6910 printf ("}");
6911 }
6912 else if (op == 0xc7)
6913 {
6914 GET_OP (op2);
6915 if (op2 == 0 || (op2 & 0xf0) != 0)
6916 printf (_("[Spare]"));
6917 else
6918 {
6919 unsigned int mask = op2 & 0x0f;
6920 int first = 1;
6921 int i;
6922
6923 printf ("pop {");
6924 for (i = 0; i < 4; i++)
6925 if (mask & (1 << i))
6926 {
6927 if (first)
6928 first = 0;
6929 else
6930 printf (", ");
6931 printf ("wCGR%d", i);
6932 }
6933 printf ("}");
6934 }
6935 }
6936 else
6937 printf (_(" [unsupported opcode]"));
6938 printf ("\n");
6939 }
6940 }
6941
6942 static void
6943 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
6944 unsigned int word, unsigned int remaining,
6945 unsigned int more_words,
6946 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6947 struct arm_section *data_arm_sec)
6948 {
6949 struct absaddr addr;
6950
6951 /* Decode the unwinding instructions. */
6952 while (1)
6953 {
6954 unsigned int op, op2;
6955
6956 ADVANCE;
6957 if (remaining == 0)
6958 break;
6959 remaining--;
6960 op = word >> 24;
6961 word <<= 8;
6962
6963 printf (" 0x%02x ", op);
6964
6965 if ((op & 0xc0) == 0x00)
6966 {
6967 int offset = ((op & 0x3f) << 3) + 8;
6968 printf (" sp = sp + %d", offset);
6969 }
6970 else if ((op & 0xc0) == 0x80)
6971 {
6972 GET_OP (op2);
6973 if (op == 0x80 && op2 == 0)
6974 printf (_("Refuse to unwind"));
6975 else
6976 {
6977 unsigned int mask = ((op & 0x1f) << 8) | op2;
6978 if (op & 0x20)
6979 printf ("pop compact {");
6980 else
6981 printf ("pop {");
6982
6983 decode_tic6x_unwind_regmask (mask);
6984 printf("}");
6985 }
6986 }
6987 else if ((op & 0xf0) == 0xc0)
6988 {
6989 unsigned int reg;
6990 unsigned int nregs;
6991 unsigned int i;
6992 const char *name;
6993 struct
6994 {
6995 unsigned int offset;
6996 unsigned int reg;
6997 } regpos[16];
6998
6999 /* Scan entire instruction first so that GET_OP output is not
7000 interleaved with disassembly. */
7001 nregs = 0;
7002 for (i = 0; nregs < (op & 0xf); i++)
7003 {
7004 GET_OP (op2);
7005 reg = op2 >> 4;
7006 if (reg != 0xf)
7007 {
7008 regpos[nregs].offset = i * 2;
7009 regpos[nregs].reg = reg;
7010 nregs++;
7011 }
7012
7013 reg = op2 & 0xf;
7014 if (reg != 0xf)
7015 {
7016 regpos[nregs].offset = i * 2 + 1;
7017 regpos[nregs].reg = reg;
7018 nregs++;
7019 }
7020 }
7021
7022 printf (_("pop frame {"));
7023 reg = nregs - 1;
7024 for (i = i * 2; i > 0; i--)
7025 {
7026 if (regpos[reg].offset == i - 1)
7027 {
7028 name = tic6x_unwind_regnames[regpos[reg].reg];
7029 if (reg > 0)
7030 reg--;
7031 }
7032 else
7033 name = _("[pad]");
7034
7035 fputs (name, stdout);
7036 if (i > 1)
7037 printf (", ");
7038 }
7039
7040 printf ("}");
7041 }
7042 else if (op == 0xd0)
7043 printf (" MOV FP, SP");
7044 else if (op == 0xd1)
7045 printf (" __c6xabi_pop_rts");
7046 else if (op == 0xd2)
7047 {
7048 unsigned char buf[9];
7049 unsigned int i, len;
7050 unsigned long offset;
7051
7052 for (i = 0; i < sizeof (buf); i++)
7053 {
7054 GET_OP (buf[i]);
7055 if ((buf[i] & 0x80) == 0)
7056 break;
7057 }
7058 assert (i < sizeof (buf));
7059 offset = read_uleb128 (buf, &len);
7060 assert (len == i + 1);
7061 offset = offset * 8 + 0x408;
7062 printf (_("sp = sp + %ld"), offset);
7063 }
7064 else if ((op & 0xf0) == 0xe0)
7065 {
7066 if ((op & 0x0f) == 7)
7067 printf (" RETURN");
7068 else
7069 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7070 }
7071 else
7072 {
7073 printf (_(" [unsupported opcode]"));
7074 }
7075 putchar ('\n');
7076 }
7077 }
7078
7079 static bfd_vma
7080 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7081 {
7082 bfd_vma offset;
7083
7084 offset = word & 0x7fffffff;
7085 if (offset & 0x40000000)
7086 offset |= ~ (bfd_vma) 0x7fffffff;
7087
7088 if (elf_header.e_machine == EM_TI_C6000)
7089 offset <<= 1;
7090
7091 return offset + where;
7092 }
7093
7094 static void
7095 decode_arm_unwind (struct arm_unw_aux_info * aux,
7096 unsigned int word,
7097 unsigned int remaining,
7098 bfd_vma data_offset,
7099 Elf_Internal_Shdr * data_sec,
7100 struct arm_section * data_arm_sec)
7101 {
7102 int per_index;
7103 unsigned int more_words = 0;
7104 struct absaddr addr;
7105 bfd_vma sym_name = (bfd_vma) -1;
7106
7107 if (remaining == 0)
7108 {
7109 /* Fetch the first word.
7110 Note - when decoding an object file the address extracted
7111 here will always be 0. So we also pass in the sym_name
7112 parameter so that we can find the symbol associated with
7113 the personality routine. */
7114 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7115 & word, & addr, & sym_name))
7116 return;
7117
7118 remaining = 4;
7119 }
7120
7121 if ((word & 0x80000000) == 0)
7122 {
7123 /* Expand prel31 for personality routine. */
7124 bfd_vma fn;
7125 const char *procname;
7126
7127 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7128 printf (_(" Personality routine: "));
7129 if (fn == 0
7130 && addr.section == SHN_UNDEF && addr.offset == 0
7131 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7132 {
7133 procname = aux->strtab + sym_name;
7134 print_vma (fn, PREFIX_HEX);
7135 if (procname)
7136 {
7137 fputs (" <", stdout);
7138 fputs (procname, stdout);
7139 fputc ('>', stdout);
7140 }
7141 }
7142 else
7143 procname = arm_print_vma_and_name (aux, fn, addr);
7144 fputc ('\n', stdout);
7145
7146 /* The GCC personality routines use the standard compact
7147 encoding, starting with one byte giving the number of
7148 words. */
7149 if (procname != NULL
7150 && (const_strneq (procname, "__gcc_personality_v0")
7151 || const_strneq (procname, "__gxx_personality_v0")
7152 || const_strneq (procname, "__gcj_personality_v0")
7153 || const_strneq (procname, "__gnu_objc_personality_v0")))
7154 {
7155 remaining = 0;
7156 more_words = 1;
7157 ADVANCE;
7158 if (!remaining)
7159 {
7160 printf (_(" [Truncated data]\n"));
7161 return;
7162 }
7163 more_words = word >> 24;
7164 word <<= 8;
7165 remaining--;
7166 per_index = -1;
7167 }
7168 else
7169 return;
7170 }
7171 else
7172 {
7173 /* ARM EHABI Section 6.3:
7174
7175 An exception-handling table entry for the compact model looks like:
7176
7177 31 30-28 27-24 23-0
7178 -- ----- ----- ----
7179 1 0 index Data for personalityRoutine[index] */
7180
7181 if (elf_header.e_machine == EM_ARM
7182 && (word & 0x70000000))
7183 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7184
7185 per_index = (word >> 24) & 0x7f;
7186 printf (_(" Compact model index: %d\n"), per_index);
7187 if (per_index == 0)
7188 {
7189 more_words = 0;
7190 word <<= 8;
7191 remaining--;
7192 }
7193 else if (per_index < 3)
7194 {
7195 more_words = (word >> 16) & 0xff;
7196 word <<= 16;
7197 remaining -= 2;
7198 }
7199 }
7200
7201 switch (elf_header.e_machine)
7202 {
7203 case EM_ARM:
7204 if (per_index < 3)
7205 {
7206 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7207 data_offset, data_sec, data_arm_sec);
7208 }
7209 else
7210 {
7211 warn (_("Unknown ARM compact model index encountered\n"));
7212 printf (_(" [reserved]\n"));
7213 }
7214 break;
7215
7216 case EM_TI_C6000:
7217 if (per_index < 3)
7218 {
7219 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7220 data_offset, data_sec, data_arm_sec);
7221 }
7222 else if (per_index < 5)
7223 {
7224 if (((word >> 17) & 0x7f) == 0x7f)
7225 printf (_(" Restore stack from frame pointer\n"));
7226 else
7227 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
7228 printf (_(" Registers restored: "));
7229 if (per_index == 4)
7230 printf (" (compact) ");
7231 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7232 putchar ('\n');
7233 printf (_(" Return register: %s\n"),
7234 tic6x_unwind_regnames[word & 0xf]);
7235 }
7236 else
7237 printf (_(" [reserved (%d)]\n"), per_index);
7238 break;
7239
7240 default:
7241 error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7242 elf_header.e_machine);
7243 }
7244
7245 /* Decode the descriptors. Not implemented. */
7246 }
7247
7248 static void
7249 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7250 {
7251 struct arm_section exidx_arm_sec, extab_arm_sec;
7252 unsigned int i, exidx_len;
7253
7254 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7255 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7256 exidx_len = exidx_sec->sh_size / 8;
7257
7258 for (i = 0; i < exidx_len; i++)
7259 {
7260 unsigned int exidx_fn, exidx_entry;
7261 struct absaddr fn_addr, entry_addr;
7262 bfd_vma fn;
7263
7264 fputc ('\n', stdout);
7265
7266 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7267 8 * i, & exidx_fn, & fn_addr, NULL)
7268 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7269 8 * i + 4, & exidx_entry, & entry_addr, NULL))
7270 {
7271 arm_free_section (& exidx_arm_sec);
7272 arm_free_section (& extab_arm_sec);
7273 return;
7274 }
7275
7276 /* ARM EHABI, Section 5:
7277 An index table entry consists of 2 words.
7278 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
7279 if (exidx_fn & 0x80000000)
7280 warn (_("corrupt index table entry: %x\n"), exidx_fn);
7281
7282 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7283
7284 arm_print_vma_and_name (aux, fn, fn_addr);
7285 fputs (": ", stdout);
7286
7287 if (exidx_entry == 1)
7288 {
7289 print_vma (exidx_entry, PREFIX_HEX);
7290 fputs (" [cantunwind]\n", stdout);
7291 }
7292 else if (exidx_entry & 0x80000000)
7293 {
7294 print_vma (exidx_entry, PREFIX_HEX);
7295 fputc ('\n', stdout);
7296 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7297 }
7298 else
7299 {
7300 bfd_vma table, table_offset = 0;
7301 Elf_Internal_Shdr *table_sec;
7302
7303 fputs ("@", stdout);
7304 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7305 print_vma (table, PREFIX_HEX);
7306 printf ("\n");
7307
7308 /* Locate the matching .ARM.extab. */
7309 if (entry_addr.section != SHN_UNDEF
7310 && entry_addr.section < elf_header.e_shnum)
7311 {
7312 table_sec = section_headers + entry_addr.section;
7313 table_offset = entry_addr.offset;
7314 }
7315 else
7316 {
7317 table_sec = find_section_by_address (table);
7318 if (table_sec != NULL)
7319 table_offset = table - table_sec->sh_addr;
7320 }
7321 if (table_sec == NULL)
7322 {
7323 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7324 (unsigned long) table);
7325 continue;
7326 }
7327 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7328 &extab_arm_sec);
7329 }
7330 }
7331
7332 printf ("\n");
7333
7334 arm_free_section (&exidx_arm_sec);
7335 arm_free_section (&extab_arm_sec);
7336 }
7337
7338 /* Used for both ARM and C6X unwinding tables. */
7339
7340 static void
7341 arm_process_unwind (FILE *file)
7342 {
7343 struct arm_unw_aux_info aux;
7344 Elf_Internal_Shdr *unwsec = NULL;
7345 Elf_Internal_Shdr *strsec;
7346 Elf_Internal_Shdr *sec;
7347 unsigned long i;
7348 unsigned int sec_type;
7349
7350 switch (elf_header.e_machine)
7351 {
7352 case EM_ARM:
7353 sec_type = SHT_ARM_EXIDX;
7354 break;
7355
7356 case EM_TI_C6000:
7357 sec_type = SHT_C6000_UNWIND;
7358 break;
7359
7360 default:
7361 error (_("Unsupported architecture type %d encountered when processing unwind table"),
7362 elf_header.e_machine);
7363 return;
7364 }
7365
7366 if (string_table == NULL)
7367 return;
7368
7369 memset (& aux, 0, sizeof (aux));
7370 aux.file = file;
7371
7372 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7373 {
7374 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7375 {
7376 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7377
7378 strsec = section_headers + sec->sh_link;
7379 assert (aux.strtab == NULL);
7380 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7381 1, strsec->sh_size, _("string table"));
7382 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7383 }
7384 else if (sec->sh_type == sec_type)
7385 unwsec = sec;
7386 }
7387
7388 if (unwsec == NULL)
7389 printf (_("\nThere are no unwind sections in this file.\n"));
7390 else
7391 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7392 {
7393 if (sec->sh_type == sec_type)
7394 {
7395 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7396 SECTION_NAME (sec),
7397 (unsigned long) sec->sh_offset,
7398 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7399
7400 dump_arm_unwind (&aux, sec);
7401 }
7402 }
7403
7404 if (aux.symtab)
7405 free (aux.symtab);
7406 if (aux.strtab)
7407 free ((char *) aux.strtab);
7408 }
7409
7410 static void
7411 process_unwind (FILE * file)
7412 {
7413 struct unwind_handler
7414 {
7415 int machtype;
7416 void (* handler)(FILE *);
7417 } handlers[] =
7418 {
7419 { EM_ARM, arm_process_unwind },
7420 { EM_IA_64, ia64_process_unwind },
7421 { EM_PARISC, hppa_process_unwind },
7422 { EM_TI_C6000, arm_process_unwind },
7423 { 0, 0 }
7424 };
7425 int i;
7426
7427 if (!do_unwind)
7428 return;
7429
7430 for (i = 0; handlers[i].handler != NULL; i++)
7431 if (elf_header.e_machine == handlers[i].machtype)
7432 return handlers[i].handler (file);
7433
7434 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7435 get_machine_name (elf_header.e_machine));
7436 }
7437
7438 static void
7439 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7440 {
7441 switch (entry->d_tag)
7442 {
7443 case DT_MIPS_FLAGS:
7444 if (entry->d_un.d_val == 0)
7445 printf (_("NONE"));
7446 else
7447 {
7448 static const char * opts[] =
7449 {
7450 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7451 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7452 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7453 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7454 "RLD_ORDER_SAFE"
7455 };
7456 unsigned int cnt;
7457 int first = 1;
7458
7459 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7460 if (entry->d_un.d_val & (1 << cnt))
7461 {
7462 printf ("%s%s", first ? "" : " ", opts[cnt]);
7463 first = 0;
7464 }
7465 }
7466 break;
7467
7468 case DT_MIPS_IVERSION:
7469 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7470 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7471 else
7472 printf (_("<corrupt: %" BFD_VMA_FMT "d>"), entry->d_un.d_ptr);
7473 break;
7474
7475 case DT_MIPS_TIME_STAMP:
7476 {
7477 char timebuf[20];
7478 struct tm * tmp;
7479
7480 time_t atime = entry->d_un.d_val;
7481 tmp = gmtime (&atime);
7482 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7483 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7484 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7485 printf (_("Time Stamp: %s"), timebuf);
7486 }
7487 break;
7488
7489 case DT_MIPS_RLD_VERSION:
7490 case DT_MIPS_LOCAL_GOTNO:
7491 case DT_MIPS_CONFLICTNO:
7492 case DT_MIPS_LIBLISTNO:
7493 case DT_MIPS_SYMTABNO:
7494 case DT_MIPS_UNREFEXTNO:
7495 case DT_MIPS_HIPAGENO:
7496 case DT_MIPS_DELTA_CLASS_NO:
7497 case DT_MIPS_DELTA_INSTANCE_NO:
7498 case DT_MIPS_DELTA_RELOC_NO:
7499 case DT_MIPS_DELTA_SYM_NO:
7500 case DT_MIPS_DELTA_CLASSSYM_NO:
7501 case DT_MIPS_COMPACT_SIZE:
7502 print_vma (entry->d_un.d_ptr, DEC);
7503 break;
7504
7505 default:
7506 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7507 }
7508 putchar ('\n');
7509 }
7510
7511 static void
7512 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7513 {
7514 switch (entry->d_tag)
7515 {
7516 case DT_HP_DLD_FLAGS:
7517 {
7518 static struct
7519 {
7520 long int bit;
7521 const char * str;
7522 }
7523 flags[] =
7524 {
7525 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7526 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7527 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7528 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7529 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7530 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7531 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7532 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7533 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7534 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7535 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7536 { DT_HP_GST, "HP_GST" },
7537 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7538 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7539 { DT_HP_NODELETE, "HP_NODELETE" },
7540 { DT_HP_GROUP, "HP_GROUP" },
7541 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7542 };
7543 int first = 1;
7544 size_t cnt;
7545 bfd_vma val = entry->d_un.d_val;
7546
7547 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7548 if (val & flags[cnt].bit)
7549 {
7550 if (! first)
7551 putchar (' ');
7552 fputs (flags[cnt].str, stdout);
7553 first = 0;
7554 val ^= flags[cnt].bit;
7555 }
7556
7557 if (val != 0 || first)
7558 {
7559 if (! first)
7560 putchar (' ');
7561 print_vma (val, HEX);
7562 }
7563 }
7564 break;
7565
7566 default:
7567 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7568 break;
7569 }
7570 putchar ('\n');
7571 }
7572
7573 #ifdef BFD64
7574
7575 /* VMS vs Unix time offset and factor. */
7576
7577 #define VMS_EPOCH_OFFSET 35067168000000000LL
7578 #define VMS_GRANULARITY_FACTOR 10000000
7579
7580 /* Display a VMS time in a human readable format. */
7581
7582 static void
7583 print_vms_time (bfd_int64_t vmstime)
7584 {
7585 struct tm *tm;
7586 time_t unxtime;
7587
7588 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7589 tm = gmtime (&unxtime);
7590 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7591 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7592 tm->tm_hour, tm->tm_min, tm->tm_sec);
7593 }
7594 #endif /* BFD64 */
7595
7596 static void
7597 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7598 {
7599 switch (entry->d_tag)
7600 {
7601 case DT_IA_64_PLT_RESERVE:
7602 /* First 3 slots reserved. */
7603 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7604 printf (" -- ");
7605 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7606 break;
7607
7608 case DT_IA_64_VMS_LINKTIME:
7609 #ifdef BFD64
7610 print_vms_time (entry->d_un.d_val);
7611 #endif
7612 break;
7613
7614 case DT_IA_64_VMS_LNKFLAGS:
7615 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7616 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7617 printf (" CALL_DEBUG");
7618 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7619 printf (" NOP0BUFS");
7620 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7621 printf (" P0IMAGE");
7622 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7623 printf (" MKTHREADS");
7624 if (entry->d_un.d_val & VMS_LF_UPCALLS)
7625 printf (" UPCALLS");
7626 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7627 printf (" IMGSTA");
7628 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7629 printf (" INITIALIZE");
7630 if (entry->d_un.d_val & VMS_LF_MAIN)
7631 printf (" MAIN");
7632 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7633 printf (" EXE_INIT");
7634 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7635 printf (" TBK_IN_IMG");
7636 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7637 printf (" DBG_IN_IMG");
7638 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7639 printf (" TBK_IN_DSF");
7640 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7641 printf (" DBG_IN_DSF");
7642 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7643 printf (" SIGNATURES");
7644 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7645 printf (" REL_SEG_OFF");
7646 break;
7647
7648 default:
7649 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7650 break;
7651 }
7652 putchar ('\n');
7653 }
7654
7655 static int
7656 get_32bit_dynamic_section (FILE * file)
7657 {
7658 Elf32_External_Dyn * edyn;
7659 Elf32_External_Dyn * ext;
7660 Elf_Internal_Dyn * entry;
7661
7662 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7663 dynamic_size, _("dynamic section"));
7664 if (!edyn)
7665 return 0;
7666
7667 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7668 might not have the luxury of section headers. Look for the DT_NULL
7669 terminator to determine the number of entries. */
7670 for (ext = edyn, dynamic_nent = 0;
7671 (char *) ext < (char *) edyn + dynamic_size;
7672 ext++)
7673 {
7674 dynamic_nent++;
7675 if (BYTE_GET (ext->d_tag) == DT_NULL)
7676 break;
7677 }
7678
7679 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7680 sizeof (* entry));
7681 if (dynamic_section == NULL)
7682 {
7683 error (_("Out of memory\n"));
7684 free (edyn);
7685 return 0;
7686 }
7687
7688 for (ext = edyn, entry = dynamic_section;
7689 entry < dynamic_section + dynamic_nent;
7690 ext++, entry++)
7691 {
7692 entry->d_tag = BYTE_GET (ext->d_tag);
7693 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7694 }
7695
7696 free (edyn);
7697
7698 return 1;
7699 }
7700
7701 static int
7702 get_64bit_dynamic_section (FILE * file)
7703 {
7704 Elf64_External_Dyn * edyn;
7705 Elf64_External_Dyn * ext;
7706 Elf_Internal_Dyn * entry;
7707
7708 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7709 dynamic_size, _("dynamic section"));
7710 if (!edyn)
7711 return 0;
7712
7713 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7714 might not have the luxury of section headers. Look for the DT_NULL
7715 terminator to determine the number of entries. */
7716 for (ext = edyn, dynamic_nent = 0;
7717 (char *) ext < (char *) edyn + dynamic_size;
7718 ext++)
7719 {
7720 dynamic_nent++;
7721 if (BYTE_GET (ext->d_tag) == DT_NULL)
7722 break;
7723 }
7724
7725 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7726 sizeof (* entry));
7727 if (dynamic_section == NULL)
7728 {
7729 error (_("Out of memory\n"));
7730 free (edyn);
7731 return 0;
7732 }
7733
7734 for (ext = edyn, entry = dynamic_section;
7735 entry < dynamic_section + dynamic_nent;
7736 ext++, entry++)
7737 {
7738 entry->d_tag = BYTE_GET (ext->d_tag);
7739 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7740 }
7741
7742 free (edyn);
7743
7744 return 1;
7745 }
7746
7747 static void
7748 print_dynamic_flags (bfd_vma flags)
7749 {
7750 int first = 1;
7751
7752 while (flags)
7753 {
7754 bfd_vma flag;
7755
7756 flag = flags & - flags;
7757 flags &= ~ flag;
7758
7759 if (first)
7760 first = 0;
7761 else
7762 putc (' ', stdout);
7763
7764 switch (flag)
7765 {
7766 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7767 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7768 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7769 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7770 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7771 default: fputs (_("unknown"), stdout); break;
7772 }
7773 }
7774 puts ("");
7775 }
7776
7777 /* Parse and display the contents of the dynamic section. */
7778
7779 static int
7780 process_dynamic_section (FILE * file)
7781 {
7782 Elf_Internal_Dyn * entry;
7783
7784 if (dynamic_size == 0)
7785 {
7786 if (do_dynamic)
7787 printf (_("\nThere is no dynamic section in this file.\n"));
7788
7789 return 1;
7790 }
7791
7792 if (is_32bit_elf)
7793 {
7794 if (! get_32bit_dynamic_section (file))
7795 return 0;
7796 }
7797 else if (! get_64bit_dynamic_section (file))
7798 return 0;
7799
7800 /* Find the appropriate symbol table. */
7801 if (dynamic_symbols == NULL)
7802 {
7803 for (entry = dynamic_section;
7804 entry < dynamic_section + dynamic_nent;
7805 ++entry)
7806 {
7807 Elf_Internal_Shdr section;
7808
7809 if (entry->d_tag != DT_SYMTAB)
7810 continue;
7811
7812 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7813
7814 /* Since we do not know how big the symbol table is,
7815 we default to reading in the entire file (!) and
7816 processing that. This is overkill, I know, but it
7817 should work. */
7818 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7819
7820 if (archive_file_offset != 0)
7821 section.sh_size = archive_file_size - section.sh_offset;
7822 else
7823 {
7824 if (fseek (file, 0, SEEK_END))
7825 error (_("Unable to seek to end of file!\n"));
7826
7827 section.sh_size = ftell (file) - section.sh_offset;
7828 }
7829
7830 if (is_32bit_elf)
7831 section.sh_entsize = sizeof (Elf32_External_Sym);
7832 else
7833 section.sh_entsize = sizeof (Elf64_External_Sym);
7834
7835 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
7836 if (num_dynamic_syms < 1)
7837 {
7838 error (_("Unable to determine the number of symbols to load\n"));
7839 continue;
7840 }
7841 }
7842 }
7843
7844 /* Similarly find a string table. */
7845 if (dynamic_strings == NULL)
7846 {
7847 for (entry = dynamic_section;
7848 entry < dynamic_section + dynamic_nent;
7849 ++entry)
7850 {
7851 unsigned long offset;
7852 long str_tab_len;
7853
7854 if (entry->d_tag != DT_STRTAB)
7855 continue;
7856
7857 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7858
7859 /* Since we do not know how big the string table is,
7860 we default to reading in the entire file (!) and
7861 processing that. This is overkill, I know, but it
7862 should work. */
7863
7864 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7865
7866 if (archive_file_offset != 0)
7867 str_tab_len = archive_file_size - offset;
7868 else
7869 {
7870 if (fseek (file, 0, SEEK_END))
7871 error (_("Unable to seek to end of file\n"));
7872 str_tab_len = ftell (file) - offset;
7873 }
7874
7875 if (str_tab_len < 1)
7876 {
7877 error
7878 (_("Unable to determine the length of the dynamic string table\n"));
7879 continue;
7880 }
7881
7882 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7883 str_tab_len,
7884 _("dynamic string table"));
7885 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7886 break;
7887 }
7888 }
7889
7890 /* And find the syminfo section if available. */
7891 if (dynamic_syminfo == NULL)
7892 {
7893 unsigned long syminsz = 0;
7894
7895 for (entry = dynamic_section;
7896 entry < dynamic_section + dynamic_nent;
7897 ++entry)
7898 {
7899 if (entry->d_tag == DT_SYMINENT)
7900 {
7901 /* Note: these braces are necessary to avoid a syntax
7902 error from the SunOS4 C compiler. */
7903 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7904 }
7905 else if (entry->d_tag == DT_SYMINSZ)
7906 syminsz = entry->d_un.d_val;
7907 else if (entry->d_tag == DT_SYMINFO)
7908 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7909 syminsz);
7910 }
7911
7912 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7913 {
7914 Elf_External_Syminfo * extsyminfo;
7915 Elf_External_Syminfo * extsym;
7916 Elf_Internal_Syminfo * syminfo;
7917
7918 /* There is a syminfo section. Read the data. */
7919 extsyminfo = (Elf_External_Syminfo *)
7920 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7921 _("symbol information"));
7922 if (!extsyminfo)
7923 return 0;
7924
7925 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7926 if (dynamic_syminfo == NULL)
7927 {
7928 error (_("Out of memory\n"));
7929 return 0;
7930 }
7931
7932 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7933 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7934 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7935 ++syminfo, ++extsym)
7936 {
7937 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7938 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7939 }
7940
7941 free (extsyminfo);
7942 }
7943 }
7944
7945 if (do_dynamic && dynamic_addr)
7946 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7947 dynamic_addr, dynamic_nent);
7948 if (do_dynamic)
7949 printf (_(" Tag Type Name/Value\n"));
7950
7951 for (entry = dynamic_section;
7952 entry < dynamic_section + dynamic_nent;
7953 entry++)
7954 {
7955 if (do_dynamic)
7956 {
7957 const char * dtype;
7958
7959 putchar (' ');
7960 print_vma (entry->d_tag, FULL_HEX);
7961 dtype = get_dynamic_type (entry->d_tag);
7962 printf (" (%s)%*s", dtype,
7963 ((is_32bit_elf ? 27 : 19)
7964 - (int) strlen (dtype)),
7965 " ");
7966 }
7967
7968 switch (entry->d_tag)
7969 {
7970 case DT_FLAGS:
7971 if (do_dynamic)
7972 print_dynamic_flags (entry->d_un.d_val);
7973 break;
7974
7975 case DT_AUXILIARY:
7976 case DT_FILTER:
7977 case DT_CONFIG:
7978 case DT_DEPAUDIT:
7979 case DT_AUDIT:
7980 if (do_dynamic)
7981 {
7982 switch (entry->d_tag)
7983 {
7984 case DT_AUXILIARY:
7985 printf (_("Auxiliary library"));
7986 break;
7987
7988 case DT_FILTER:
7989 printf (_("Filter library"));
7990 break;
7991
7992 case DT_CONFIG:
7993 printf (_("Configuration file"));
7994 break;
7995
7996 case DT_DEPAUDIT:
7997 printf (_("Dependency audit library"));
7998 break;
7999
8000 case DT_AUDIT:
8001 printf (_("Audit library"));
8002 break;
8003 }
8004
8005 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8006 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8007 else
8008 {
8009 printf (": ");
8010 print_vma (entry->d_un.d_val, PREFIX_HEX);
8011 putchar ('\n');
8012 }
8013 }
8014 break;
8015
8016 case DT_FEATURE:
8017 if (do_dynamic)
8018 {
8019 printf (_("Flags:"));
8020
8021 if (entry->d_un.d_val == 0)
8022 printf (_(" None\n"));
8023 else
8024 {
8025 unsigned long int val = entry->d_un.d_val;
8026
8027 if (val & DTF_1_PARINIT)
8028 {
8029 printf (" PARINIT");
8030 val ^= DTF_1_PARINIT;
8031 }
8032 if (val & DTF_1_CONFEXP)
8033 {
8034 printf (" CONFEXP");
8035 val ^= DTF_1_CONFEXP;
8036 }
8037 if (val != 0)
8038 printf (" %lx", val);
8039 puts ("");
8040 }
8041 }
8042 break;
8043
8044 case DT_POSFLAG_1:
8045 if (do_dynamic)
8046 {
8047 printf (_("Flags:"));
8048
8049 if (entry->d_un.d_val == 0)
8050 printf (_(" None\n"));
8051 else
8052 {
8053 unsigned long int val = entry->d_un.d_val;
8054
8055 if (val & DF_P1_LAZYLOAD)
8056 {
8057 printf (" LAZYLOAD");
8058 val ^= DF_P1_LAZYLOAD;
8059 }
8060 if (val & DF_P1_GROUPPERM)
8061 {
8062 printf (" GROUPPERM");
8063 val ^= DF_P1_GROUPPERM;
8064 }
8065 if (val != 0)
8066 printf (" %lx", val);
8067 puts ("");
8068 }
8069 }
8070 break;
8071
8072 case DT_FLAGS_1:
8073 if (do_dynamic)
8074 {
8075 printf (_("Flags:"));
8076 if (entry->d_un.d_val == 0)
8077 printf (_(" None\n"));
8078 else
8079 {
8080 unsigned long int val = entry->d_un.d_val;
8081
8082 if (val & DF_1_NOW)
8083 {
8084 printf (" NOW");
8085 val ^= DF_1_NOW;
8086 }
8087 if (val & DF_1_GLOBAL)
8088 {
8089 printf (" GLOBAL");
8090 val ^= DF_1_GLOBAL;
8091 }
8092 if (val & DF_1_GROUP)
8093 {
8094 printf (" GROUP");
8095 val ^= DF_1_GROUP;
8096 }
8097 if (val & DF_1_NODELETE)
8098 {
8099 printf (" NODELETE");
8100 val ^= DF_1_NODELETE;
8101 }
8102 if (val & DF_1_LOADFLTR)
8103 {
8104 printf (" LOADFLTR");
8105 val ^= DF_1_LOADFLTR;
8106 }
8107 if (val & DF_1_INITFIRST)
8108 {
8109 printf (" INITFIRST");
8110 val ^= DF_1_INITFIRST;
8111 }
8112 if (val & DF_1_NOOPEN)
8113 {
8114 printf (" NOOPEN");
8115 val ^= DF_1_NOOPEN;
8116 }
8117 if (val & DF_1_ORIGIN)
8118 {
8119 printf (" ORIGIN");
8120 val ^= DF_1_ORIGIN;
8121 }
8122 if (val & DF_1_DIRECT)
8123 {
8124 printf (" DIRECT");
8125 val ^= DF_1_DIRECT;
8126 }
8127 if (val & DF_1_TRANS)
8128 {
8129 printf (" TRANS");
8130 val ^= DF_1_TRANS;
8131 }
8132 if (val & DF_1_INTERPOSE)
8133 {
8134 printf (" INTERPOSE");
8135 val ^= DF_1_INTERPOSE;
8136 }
8137 if (val & DF_1_NODEFLIB)
8138 {
8139 printf (" NODEFLIB");
8140 val ^= DF_1_NODEFLIB;
8141 }
8142 if (val & DF_1_NODUMP)
8143 {
8144 printf (" NODUMP");
8145 val ^= DF_1_NODUMP;
8146 }
8147 if (val & DF_1_CONFALT)
8148 {
8149 printf (" CONFALT");
8150 val ^= DF_1_CONFALT;
8151 }
8152 if (val & DF_1_ENDFILTEE)
8153 {
8154 printf (" ENDFILTEE");
8155 val ^= DF_1_ENDFILTEE;
8156 }
8157 if (val & DF_1_DISPRELDNE)
8158 {
8159 printf (" DISPRELDNE");
8160 val ^= DF_1_DISPRELDNE;
8161 }
8162 if (val & DF_1_DISPRELPND)
8163 {
8164 printf (" DISPRELPND");
8165 val ^= DF_1_DISPRELPND;
8166 }
8167 if (val & DF_1_NODIRECT)
8168 {
8169 printf (" NODIRECT");
8170 val ^= DF_1_NODIRECT;
8171 }
8172 if (val & DF_1_IGNMULDEF)
8173 {
8174 printf (" IGNMULDEF");
8175 val ^= DF_1_IGNMULDEF;
8176 }
8177 if (val & DF_1_NOKSYMS)
8178 {
8179 printf (" NOKSYMS");
8180 val ^= DF_1_NOKSYMS;
8181 }
8182 if (val & DF_1_NOHDR)
8183 {
8184 printf (" NOHDR");
8185 val ^= DF_1_NOHDR;
8186 }
8187 if (val & DF_1_EDITED)
8188 {
8189 printf (" EDITED");
8190 val ^= DF_1_EDITED;
8191 }
8192 if (val & DF_1_NORELOC)
8193 {
8194 printf (" NORELOC");
8195 val ^= DF_1_NORELOC;
8196 }
8197 if (val & DF_1_SYMINTPOSE)
8198 {
8199 printf (" SYMINTPOSE");
8200 val ^= DF_1_SYMINTPOSE;
8201 }
8202 if (val & DF_1_GLOBAUDIT)
8203 {
8204 printf (" GLOBAUDIT");
8205 val ^= DF_1_GLOBAUDIT;
8206 }
8207 if (val & DF_1_SINGLETON)
8208 {
8209 printf (" SINGLETON");
8210 val ^= DF_1_SINGLETON;
8211 }
8212 if (val != 0)
8213 printf (" %lx", val);
8214 puts ("");
8215 }
8216 }
8217 break;
8218
8219 case DT_PLTREL:
8220 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8221 if (do_dynamic)
8222 puts (get_dynamic_type (entry->d_un.d_val));
8223 break;
8224
8225 case DT_NULL :
8226 case DT_NEEDED :
8227 case DT_PLTGOT :
8228 case DT_HASH :
8229 case DT_STRTAB :
8230 case DT_SYMTAB :
8231 case DT_RELA :
8232 case DT_INIT :
8233 case DT_FINI :
8234 case DT_SONAME :
8235 case DT_RPATH :
8236 case DT_SYMBOLIC:
8237 case DT_REL :
8238 case DT_DEBUG :
8239 case DT_TEXTREL :
8240 case DT_JMPREL :
8241 case DT_RUNPATH :
8242 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8243
8244 if (do_dynamic)
8245 {
8246 char * name;
8247
8248 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8249 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8250 else
8251 name = NULL;
8252
8253 if (name)
8254 {
8255 switch (entry->d_tag)
8256 {
8257 case DT_NEEDED:
8258 printf (_("Shared library: [%s]"), name);
8259
8260 if (streq (name, program_interpreter))
8261 printf (_(" program interpreter"));
8262 break;
8263
8264 case DT_SONAME:
8265 printf (_("Library soname: [%s]"), name);
8266 break;
8267
8268 case DT_RPATH:
8269 printf (_("Library rpath: [%s]"), name);
8270 break;
8271
8272 case DT_RUNPATH:
8273 printf (_("Library runpath: [%s]"), name);
8274 break;
8275
8276 default:
8277 print_vma (entry->d_un.d_val, PREFIX_HEX);
8278 break;
8279 }
8280 }
8281 else
8282 print_vma (entry->d_un.d_val, PREFIX_HEX);
8283
8284 putchar ('\n');
8285 }
8286 break;
8287
8288 case DT_PLTRELSZ:
8289 case DT_RELASZ :
8290 case DT_STRSZ :
8291 case DT_RELSZ :
8292 case DT_RELAENT :
8293 case DT_SYMENT :
8294 case DT_RELENT :
8295 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8296 case DT_PLTPADSZ:
8297 case DT_MOVEENT :
8298 case DT_MOVESZ :
8299 case DT_INIT_ARRAYSZ:
8300 case DT_FINI_ARRAYSZ:
8301 case DT_GNU_CONFLICTSZ:
8302 case DT_GNU_LIBLISTSZ:
8303 if (do_dynamic)
8304 {
8305 print_vma (entry->d_un.d_val, UNSIGNED);
8306 printf (_(" (bytes)\n"));
8307 }
8308 break;
8309
8310 case DT_VERDEFNUM:
8311 case DT_VERNEEDNUM:
8312 case DT_RELACOUNT:
8313 case DT_RELCOUNT:
8314 if (do_dynamic)
8315 {
8316 print_vma (entry->d_un.d_val, UNSIGNED);
8317 putchar ('\n');
8318 }
8319 break;
8320
8321 case DT_SYMINSZ:
8322 case DT_SYMINENT:
8323 case DT_SYMINFO:
8324 case DT_USED:
8325 case DT_INIT_ARRAY:
8326 case DT_FINI_ARRAY:
8327 if (do_dynamic)
8328 {
8329 if (entry->d_tag == DT_USED
8330 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8331 {
8332 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8333
8334 if (*name)
8335 {
8336 printf (_("Not needed object: [%s]\n"), name);
8337 break;
8338 }
8339 }
8340
8341 print_vma (entry->d_un.d_val, PREFIX_HEX);
8342 putchar ('\n');
8343 }
8344 break;
8345
8346 case DT_BIND_NOW:
8347 /* The value of this entry is ignored. */
8348 if (do_dynamic)
8349 putchar ('\n');
8350 break;
8351
8352 case DT_GNU_PRELINKED:
8353 if (do_dynamic)
8354 {
8355 struct tm * tmp;
8356 time_t atime = entry->d_un.d_val;
8357
8358 tmp = gmtime (&atime);
8359 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8360 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8361 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8362
8363 }
8364 break;
8365
8366 case DT_GNU_HASH:
8367 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8368 if (do_dynamic)
8369 {
8370 print_vma (entry->d_un.d_val, PREFIX_HEX);
8371 putchar ('\n');
8372 }
8373 break;
8374
8375 default:
8376 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8377 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8378 entry->d_un.d_val;
8379
8380 if (do_dynamic)
8381 {
8382 switch (elf_header.e_machine)
8383 {
8384 case EM_MIPS:
8385 case EM_MIPS_RS3_LE:
8386 dynamic_section_mips_val (entry);
8387 break;
8388 case EM_PARISC:
8389 dynamic_section_parisc_val (entry);
8390 break;
8391 case EM_IA_64:
8392 dynamic_section_ia64_val (entry);
8393 break;
8394 default:
8395 print_vma (entry->d_un.d_val, PREFIX_HEX);
8396 putchar ('\n');
8397 }
8398 }
8399 break;
8400 }
8401 }
8402
8403 return 1;
8404 }
8405
8406 static char *
8407 get_ver_flags (unsigned int flags)
8408 {
8409 static char buff[32];
8410
8411 buff[0] = 0;
8412
8413 if (flags == 0)
8414 return _("none");
8415
8416 if (flags & VER_FLG_BASE)
8417 strcat (buff, "BASE ");
8418
8419 if (flags & VER_FLG_WEAK)
8420 {
8421 if (flags & VER_FLG_BASE)
8422 strcat (buff, "| ");
8423
8424 strcat (buff, "WEAK ");
8425 }
8426
8427 if (flags & VER_FLG_INFO)
8428 {
8429 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8430 strcat (buff, "| ");
8431
8432 strcat (buff, "INFO ");
8433 }
8434
8435 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8436 strcat (buff, _("| <unknown>"));
8437
8438 return buff;
8439 }
8440
8441 /* Display the contents of the version sections. */
8442
8443 static int
8444 process_version_sections (FILE * file)
8445 {
8446 Elf_Internal_Shdr * section;
8447 unsigned i;
8448 int found = 0;
8449
8450 if (! do_version)
8451 return 1;
8452
8453 for (i = 0, section = section_headers;
8454 i < elf_header.e_shnum;
8455 i++, section++)
8456 {
8457 switch (section->sh_type)
8458 {
8459 case SHT_GNU_verdef:
8460 {
8461 Elf_External_Verdef * edefs;
8462 unsigned int idx;
8463 unsigned int cnt;
8464 char * endbuf;
8465
8466 found = 1;
8467
8468 printf
8469 (_("\nVersion definition section '%s' contains %u entries:\n"),
8470 SECTION_NAME (section), section->sh_info);
8471
8472 printf (_(" Addr: 0x"));
8473 printf_vma (section->sh_addr);
8474 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8475 (unsigned long) section->sh_offset, section->sh_link,
8476 section->sh_link < elf_header.e_shnum
8477 ? SECTION_NAME (section_headers + section->sh_link)
8478 : _("<corrupt>"));
8479
8480 edefs = (Elf_External_Verdef *)
8481 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8482 _("version definition section"));
8483 if (!edefs)
8484 break;
8485 endbuf = (char *) edefs + section->sh_size;
8486
8487 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8488 {
8489 char * vstart;
8490 Elf_External_Verdef * edef;
8491 Elf_Internal_Verdef ent;
8492 Elf_External_Verdaux * eaux;
8493 Elf_Internal_Verdaux aux;
8494 int j;
8495 int isum;
8496
8497 /* Check for very large indicies. */
8498 if (idx > (size_t) (endbuf - (char *) edefs))
8499 break;
8500
8501 vstart = ((char *) edefs) + idx;
8502 if (vstart + sizeof (*edef) > endbuf)
8503 break;
8504
8505 edef = (Elf_External_Verdef *) vstart;
8506
8507 ent.vd_version = BYTE_GET (edef->vd_version);
8508 ent.vd_flags = BYTE_GET (edef->vd_flags);
8509 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
8510 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
8511 ent.vd_hash = BYTE_GET (edef->vd_hash);
8512 ent.vd_aux = BYTE_GET (edef->vd_aux);
8513 ent.vd_next = BYTE_GET (edef->vd_next);
8514
8515 printf (_(" %#06x: Rev: %d Flags: %s"),
8516 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8517
8518 printf (_(" Index: %d Cnt: %d "),
8519 ent.vd_ndx, ent.vd_cnt);
8520
8521 /* Check for overflow. */
8522 if (ent.vd_aux > (size_t) (endbuf - vstart))
8523 break;
8524
8525 vstart += ent.vd_aux;
8526
8527 eaux = (Elf_External_Verdaux *) vstart;
8528
8529 aux.vda_name = BYTE_GET (eaux->vda_name);
8530 aux.vda_next = BYTE_GET (eaux->vda_next);
8531
8532 if (VALID_DYNAMIC_NAME (aux.vda_name))
8533 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8534 else
8535 printf (_("Name index: %ld\n"), aux.vda_name);
8536
8537 isum = idx + ent.vd_aux;
8538
8539 for (j = 1; j < ent.vd_cnt; j++)
8540 {
8541 /* Check for overflow. */
8542 if (aux.vda_next > (size_t) (endbuf - vstart))
8543 break;
8544
8545 isum += aux.vda_next;
8546 vstart += aux.vda_next;
8547
8548 eaux = (Elf_External_Verdaux *) vstart;
8549 if (vstart + sizeof (*eaux) > endbuf)
8550 break;
8551
8552 aux.vda_name = BYTE_GET (eaux->vda_name);
8553 aux.vda_next = BYTE_GET (eaux->vda_next);
8554
8555 if (VALID_DYNAMIC_NAME (aux.vda_name))
8556 printf (_(" %#06x: Parent %d: %s\n"),
8557 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8558 else
8559 printf (_(" %#06x: Parent %d, name index: %ld\n"),
8560 isum, j, aux.vda_name);
8561 }
8562
8563 if (j < ent.vd_cnt)
8564 printf (_(" Version def aux past end of section\n"));
8565
8566 idx += ent.vd_next;
8567 }
8568
8569 if (cnt < section->sh_info)
8570 printf (_(" Version definition past end of section\n"));
8571
8572 free (edefs);
8573 }
8574 break;
8575
8576 case SHT_GNU_verneed:
8577 {
8578 Elf_External_Verneed * eneed;
8579 unsigned int idx;
8580 unsigned int cnt;
8581 char * endbuf;
8582
8583 found = 1;
8584
8585 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8586 SECTION_NAME (section), section->sh_info);
8587
8588 printf (_(" Addr: 0x"));
8589 printf_vma (section->sh_addr);
8590 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8591 (unsigned long) section->sh_offset, section->sh_link,
8592 section->sh_link < elf_header.e_shnum
8593 ? SECTION_NAME (section_headers + section->sh_link)
8594 : _("<corrupt>"));
8595
8596 eneed = (Elf_External_Verneed *) get_data (NULL, file,
8597 section->sh_offset, 1,
8598 section->sh_size,
8599 _("Version Needs section"));
8600 if (!eneed)
8601 break;
8602 endbuf = (char *) eneed + section->sh_size;
8603
8604 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8605 {
8606 Elf_External_Verneed * entry;
8607 Elf_Internal_Verneed ent;
8608 int j;
8609 int isum;
8610 char * vstart;
8611
8612 if (idx > (size_t) (endbuf - (char *) eneed))
8613 break;
8614
8615 vstart = ((char *) eneed) + idx;
8616 if (vstart + sizeof (*entry) > endbuf)
8617 break;
8618
8619 entry = (Elf_External_Verneed *) vstart;
8620
8621 ent.vn_version = BYTE_GET (entry->vn_version);
8622 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
8623 ent.vn_file = BYTE_GET (entry->vn_file);
8624 ent.vn_aux = BYTE_GET (entry->vn_aux);
8625 ent.vn_next = BYTE_GET (entry->vn_next);
8626
8627 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
8628
8629 if (VALID_DYNAMIC_NAME (ent.vn_file))
8630 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8631 else
8632 printf (_(" File: %lx"), ent.vn_file);
8633
8634 printf (_(" Cnt: %d\n"), ent.vn_cnt);
8635
8636 /* Check for overflow. */
8637 if (ent.vn_aux > (size_t) (endbuf - vstart))
8638 break;
8639
8640 vstart += ent.vn_aux;
8641
8642 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8643 {
8644 Elf_External_Vernaux * eaux;
8645 Elf_Internal_Vernaux aux;
8646
8647 if (vstart + sizeof (*eaux) > endbuf)
8648 break;
8649 eaux = (Elf_External_Vernaux *) vstart;
8650
8651 aux.vna_hash = BYTE_GET (eaux->vna_hash);
8652 aux.vna_flags = BYTE_GET (eaux->vna_flags);
8653 aux.vna_other = BYTE_GET (eaux->vna_other);
8654 aux.vna_name = BYTE_GET (eaux->vna_name);
8655 aux.vna_next = BYTE_GET (eaux->vna_next);
8656
8657 if (VALID_DYNAMIC_NAME (aux.vna_name))
8658 printf (_(" %#06x: Name: %s"),
8659 isum, GET_DYNAMIC_NAME (aux.vna_name));
8660 else
8661 printf (_(" %#06x: Name index: %lx"),
8662 isum, aux.vna_name);
8663
8664 printf (_(" Flags: %s Version: %d\n"),
8665 get_ver_flags (aux.vna_flags), aux.vna_other);
8666
8667 /* Check for overflow. */
8668 if (aux.vna_next > (size_t) (endbuf - vstart))
8669 break;
8670
8671 isum += aux.vna_next;
8672 vstart += aux.vna_next;
8673 }
8674
8675 if (j < ent.vn_cnt)
8676 warn (_("Missing Version Needs auxillary information\n"));
8677
8678 idx += ent.vn_next;
8679 }
8680
8681 if (cnt < section->sh_info)
8682 warn (_("Missing Version Needs information\n"));
8683
8684 free (eneed);
8685 }
8686 break;
8687
8688 case SHT_GNU_versym:
8689 {
8690 Elf_Internal_Shdr * link_section;
8691 int total;
8692 int cnt;
8693 unsigned char * edata;
8694 unsigned short * data;
8695 char * strtab;
8696 Elf_Internal_Sym * symbols;
8697 Elf_Internal_Shdr * string_sec;
8698 unsigned long num_syms;
8699 long off;
8700
8701 if (section->sh_link >= elf_header.e_shnum)
8702 break;
8703
8704 link_section = section_headers + section->sh_link;
8705 total = section->sh_size / sizeof (Elf_External_Versym);
8706
8707 if (link_section->sh_link >= elf_header.e_shnum)
8708 break;
8709
8710 found = 1;
8711
8712 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
8713 if (symbols == NULL)
8714 break;
8715
8716 string_sec = section_headers + link_section->sh_link;
8717
8718 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8719 string_sec->sh_size,
8720 _("version string table"));
8721 if (!strtab)
8722 {
8723 free (symbols);
8724 break;
8725 }
8726
8727 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8728 SECTION_NAME (section), total);
8729
8730 printf (_(" Addr: "));
8731 printf_vma (section->sh_addr);
8732 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8733 (unsigned long) section->sh_offset, section->sh_link,
8734 SECTION_NAME (link_section));
8735
8736 off = offset_from_vma (file,
8737 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8738 total * sizeof (short));
8739 edata = (unsigned char *) get_data (NULL, file, off, total,
8740 sizeof (short),
8741 _("version symbol data"));
8742 if (!edata)
8743 {
8744 free (strtab);
8745 free (symbols);
8746 break;
8747 }
8748
8749 data = (short unsigned int *) cmalloc (total, sizeof (short));
8750
8751 for (cnt = total; cnt --;)
8752 data[cnt] = byte_get (edata + cnt * sizeof (short),
8753 sizeof (short));
8754
8755 free (edata);
8756
8757 for (cnt = 0; cnt < total; cnt += 4)
8758 {
8759 int j, nn;
8760 int check_def, check_need;
8761 char * name;
8762
8763 printf (" %03x:", cnt);
8764
8765 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8766 switch (data[cnt + j])
8767 {
8768 case 0:
8769 fputs (_(" 0 (*local*) "), stdout);
8770 break;
8771
8772 case 1:
8773 fputs (_(" 1 (*global*) "), stdout);
8774 break;
8775
8776 default:
8777 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8778 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8779
8780 /* If this index value is greater than the size of the symbols
8781 array, break to avoid an out-of-bounds read. */
8782 if ((unsigned long)(cnt + j) >= num_syms)
8783 {
8784 warn (_("invalid index into symbol array\n"));
8785 break;
8786 }
8787
8788 check_def = 1;
8789 check_need = 1;
8790 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8791 || section_headers[symbols[cnt + j].st_shndx].sh_type
8792 != SHT_NOBITS)
8793 {
8794 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8795 check_def = 0;
8796 else
8797 check_need = 0;
8798 }
8799
8800 if (check_need
8801 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8802 {
8803 Elf_Internal_Verneed ivn;
8804 unsigned long offset;
8805
8806 offset = offset_from_vma
8807 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8808 sizeof (Elf_External_Verneed));
8809
8810 do
8811 {
8812 Elf_Internal_Vernaux ivna;
8813 Elf_External_Verneed evn;
8814 Elf_External_Vernaux evna;
8815 unsigned long a_off;
8816
8817 if (get_data (&evn, file, offset, sizeof (evn), 1,
8818 _("version need")) == NULL)
8819 break;
8820
8821 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8822 ivn.vn_next = BYTE_GET (evn.vn_next);
8823
8824 a_off = offset + ivn.vn_aux;
8825
8826 do
8827 {
8828 if (get_data (&evna, file, a_off, sizeof (evna),
8829 1, _("version need aux (2)")) == NULL)
8830 {
8831 ivna.vna_next = 0;
8832 ivna.vna_other = 0;
8833 }
8834 else
8835 {
8836 ivna.vna_next = BYTE_GET (evna.vna_next);
8837 ivna.vna_other = BYTE_GET (evna.vna_other);
8838 }
8839
8840 a_off += ivna.vna_next;
8841 }
8842 while (ivna.vna_other != data[cnt + j]
8843 && ivna.vna_next != 0);
8844
8845 if (ivna.vna_other == data[cnt + j])
8846 {
8847 ivna.vna_name = BYTE_GET (evna.vna_name);
8848
8849 if (ivna.vna_name >= string_sec->sh_size)
8850 name = _("*invalid*");
8851 else
8852 name = strtab + ivna.vna_name;
8853 nn += printf ("(%s%-*s",
8854 name,
8855 12 - (int) strlen (name),
8856 ")");
8857 check_def = 0;
8858 break;
8859 }
8860
8861 offset += ivn.vn_next;
8862 }
8863 while (ivn.vn_next);
8864 }
8865
8866 if (check_def && data[cnt + j] != 0x8001
8867 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8868 {
8869 Elf_Internal_Verdef ivd;
8870 Elf_External_Verdef evd;
8871 unsigned long offset;
8872
8873 offset = offset_from_vma
8874 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8875 sizeof evd);
8876
8877 do
8878 {
8879 if (get_data (&evd, file, offset, sizeof (evd), 1,
8880 _("version def")) == NULL)
8881 {
8882 ivd.vd_next = 0;
8883 ivd.vd_ndx = 0;
8884 }
8885 else
8886 {
8887 ivd.vd_next = BYTE_GET (evd.vd_next);
8888 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8889 }
8890
8891 offset += ivd.vd_next;
8892 }
8893 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8894 && ivd.vd_next != 0);
8895
8896 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8897 {
8898 Elf_External_Verdaux evda;
8899 Elf_Internal_Verdaux ivda;
8900
8901 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8902
8903 if (get_data (&evda, file,
8904 offset - ivd.vd_next + ivd.vd_aux,
8905 sizeof (evda), 1,
8906 _("version def aux")) == NULL)
8907 break;
8908
8909 ivda.vda_name = BYTE_GET (evda.vda_name);
8910
8911 if (ivda.vda_name >= string_sec->sh_size)
8912 name = _("*invalid*");
8913 else
8914 name = strtab + ivda.vda_name;
8915 nn += printf ("(%s%-*s",
8916 name,
8917 12 - (int) strlen (name),
8918 ")");
8919 }
8920 }
8921
8922 if (nn < 18)
8923 printf ("%*c", 18 - nn, ' ');
8924 }
8925
8926 putchar ('\n');
8927 }
8928
8929 free (data);
8930 free (strtab);
8931 free (symbols);
8932 }
8933 break;
8934
8935 default:
8936 break;
8937 }
8938 }
8939
8940 if (! found)
8941 printf (_("\nNo version information found in this file.\n"));
8942
8943 return 1;
8944 }
8945
8946 static const char *
8947 get_symbol_binding (unsigned int binding)
8948 {
8949 static char buff[32];
8950
8951 switch (binding)
8952 {
8953 case STB_LOCAL: return "LOCAL";
8954 case STB_GLOBAL: return "GLOBAL";
8955 case STB_WEAK: return "WEAK";
8956 default:
8957 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8958 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8959 binding);
8960 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8961 {
8962 if (binding == STB_GNU_UNIQUE
8963 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8964 /* GNU is still using the default value 0. */
8965 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8966 return "UNIQUE";
8967 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8968 }
8969 else
8970 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8971 return buff;
8972 }
8973 }
8974
8975 static const char *
8976 get_symbol_type (unsigned int type)
8977 {
8978 static char buff[32];
8979
8980 switch (type)
8981 {
8982 case STT_NOTYPE: return "NOTYPE";
8983 case STT_OBJECT: return "OBJECT";
8984 case STT_FUNC: return "FUNC";
8985 case STT_SECTION: return "SECTION";
8986 case STT_FILE: return "FILE";
8987 case STT_COMMON: return "COMMON";
8988 case STT_TLS: return "TLS";
8989 case STT_RELC: return "RELC";
8990 case STT_SRELC: return "SRELC";
8991 default:
8992 if (type >= STT_LOPROC && type <= STT_HIPROC)
8993 {
8994 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8995 return "THUMB_FUNC";
8996
8997 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8998 return "REGISTER";
8999
9000 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9001 return "PARISC_MILLI";
9002
9003 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9004 }
9005 else if (type >= STT_LOOS && type <= STT_HIOS)
9006 {
9007 if (elf_header.e_machine == EM_PARISC)
9008 {
9009 if (type == STT_HP_OPAQUE)
9010 return "HP_OPAQUE";
9011 if (type == STT_HP_STUB)
9012 return "HP_STUB";
9013 }
9014
9015 if (type == STT_GNU_IFUNC
9016 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9017 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9018 /* GNU is still using the default value 0. */
9019 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9020 return "IFUNC";
9021
9022 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9023 }
9024 else
9025 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9026 return buff;
9027 }
9028 }
9029
9030 static const char *
9031 get_symbol_visibility (unsigned int visibility)
9032 {
9033 switch (visibility)
9034 {
9035 case STV_DEFAULT: return "DEFAULT";
9036 case STV_INTERNAL: return "INTERNAL";
9037 case STV_HIDDEN: return "HIDDEN";
9038 case STV_PROTECTED: return "PROTECTED";
9039 default: abort ();
9040 }
9041 }
9042
9043 static const char *
9044 get_mips_symbol_other (unsigned int other)
9045 {
9046 switch (other)
9047 {
9048 case STO_OPTIONAL:
9049 return "OPTIONAL";
9050 case STO_MIPS_PLT:
9051 return "MIPS PLT";
9052 case STO_MIPS_PIC:
9053 return "MIPS PIC";
9054 case STO_MICROMIPS:
9055 return "MICROMIPS";
9056 case STO_MICROMIPS | STO_MIPS_PIC:
9057 return "MICROMIPS, MIPS PIC";
9058 case STO_MIPS16:
9059 return "MIPS16";
9060 default:
9061 return NULL;
9062 }
9063 }
9064
9065 static const char *
9066 get_ia64_symbol_other (unsigned int other)
9067 {
9068 if (is_ia64_vms ())
9069 {
9070 static char res[32];
9071
9072 res[0] = 0;
9073
9074 /* Function types is for images and .STB files only. */
9075 switch (elf_header.e_type)
9076 {
9077 case ET_DYN:
9078 case ET_EXEC:
9079 switch (VMS_ST_FUNC_TYPE (other))
9080 {
9081 case VMS_SFT_CODE_ADDR:
9082 strcat (res, " CA");
9083 break;
9084 case VMS_SFT_SYMV_IDX:
9085 strcat (res, " VEC");
9086 break;
9087 case VMS_SFT_FD:
9088 strcat (res, " FD");
9089 break;
9090 case VMS_SFT_RESERVE:
9091 strcat (res, " RSV");
9092 break;
9093 default:
9094 abort ();
9095 }
9096 break;
9097 default:
9098 break;
9099 }
9100 switch (VMS_ST_LINKAGE (other))
9101 {
9102 case VMS_STL_IGNORE:
9103 strcat (res, " IGN");
9104 break;
9105 case VMS_STL_RESERVE:
9106 strcat (res, " RSV");
9107 break;
9108 case VMS_STL_STD:
9109 strcat (res, " STD");
9110 break;
9111 case VMS_STL_LNK:
9112 strcat (res, " LNK");
9113 break;
9114 default:
9115 abort ();
9116 }
9117
9118 if (res[0] != 0)
9119 return res + 1;
9120 else
9121 return res;
9122 }
9123 return NULL;
9124 }
9125
9126 static const char *
9127 get_symbol_other (unsigned int other)
9128 {
9129 const char * result = NULL;
9130 static char buff [32];
9131
9132 if (other == 0)
9133 return "";
9134
9135 switch (elf_header.e_machine)
9136 {
9137 case EM_MIPS:
9138 result = get_mips_symbol_other (other);
9139 break;
9140 case EM_IA_64:
9141 result = get_ia64_symbol_other (other);
9142 break;
9143 default:
9144 break;
9145 }
9146
9147 if (result)
9148 return result;
9149
9150 snprintf (buff, sizeof buff, _("<other>: %x"), other);
9151 return buff;
9152 }
9153
9154 static const char *
9155 get_symbol_index_type (unsigned int type)
9156 {
9157 static char buff[32];
9158
9159 switch (type)
9160 {
9161 case SHN_UNDEF: return "UND";
9162 case SHN_ABS: return "ABS";
9163 case SHN_COMMON: return "COM";
9164 default:
9165 if (type == SHN_IA_64_ANSI_COMMON
9166 && elf_header.e_machine == EM_IA_64
9167 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9168 return "ANSI_COM";
9169 else if ((elf_header.e_machine == EM_X86_64
9170 || elf_header.e_machine == EM_L1OM
9171 || elf_header.e_machine == EM_K1OM)
9172 && type == SHN_X86_64_LCOMMON)
9173 return "LARGE_COM";
9174 else if ((type == SHN_MIPS_SCOMMON
9175 && elf_header.e_machine == EM_MIPS)
9176 || (type == SHN_TIC6X_SCOMMON
9177 && elf_header.e_machine == EM_TI_C6000))
9178 return "SCOM";
9179 else if (type == SHN_MIPS_SUNDEFINED
9180 && elf_header.e_machine == EM_MIPS)
9181 return "SUND";
9182 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9183 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9184 else if (type >= SHN_LOOS && type <= SHN_HIOS)
9185 sprintf (buff, "OS [0x%04x]", type & 0xffff);
9186 else if (type >= SHN_LORESERVE)
9187 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9188 else if (type >= elf_header.e_shnum)
9189 sprintf (buff, "bad section index[%3d]", type);
9190 else
9191 sprintf (buff, "%3d", type);
9192 break;
9193 }
9194
9195 return buff;
9196 }
9197
9198 static bfd_vma *
9199 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9200 {
9201 unsigned char * e_data;
9202 bfd_vma * i_data;
9203
9204 e_data = (unsigned char *) cmalloc (number, ent_size);
9205
9206 if (e_data == NULL)
9207 {
9208 error (_("Out of memory\n"));
9209 return NULL;
9210 }
9211
9212 if (fread (e_data, ent_size, number, file) != number)
9213 {
9214 error (_("Unable to read in dynamic data\n"));
9215 return NULL;
9216 }
9217
9218 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9219
9220 if (i_data == NULL)
9221 {
9222 error (_("Out of memory\n"));
9223 free (e_data);
9224 return NULL;
9225 }
9226
9227 while (number--)
9228 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9229
9230 free (e_data);
9231
9232 return i_data;
9233 }
9234
9235 static void
9236 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9237 {
9238 Elf_Internal_Sym * psym;
9239 int n;
9240
9241 psym = dynamic_symbols + si;
9242
9243 n = print_vma (si, DEC_5);
9244 if (n < 5)
9245 fputs (" " + n, stdout);
9246 printf (" %3lu: ", hn);
9247 print_vma (psym->st_value, LONG_HEX);
9248 putchar (' ');
9249 print_vma (psym->st_size, DEC_5);
9250
9251 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9252 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9253 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9254 /* Check to see if any other bits in the st_other field are set.
9255 Note - displaying this information disrupts the layout of the
9256 table being generated, but for the moment this case is very
9257 rare. */
9258 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9259 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9260 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9261 if (VALID_DYNAMIC_NAME (psym->st_name))
9262 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9263 else
9264 printf (_(" <corrupt: %14ld>"), psym->st_name);
9265 putchar ('\n');
9266 }
9267
9268 /* Dump the symbol table. */
9269 static int
9270 process_symbol_table (FILE * file)
9271 {
9272 Elf_Internal_Shdr * section;
9273 bfd_vma nbuckets = 0;
9274 bfd_vma nchains = 0;
9275 bfd_vma * buckets = NULL;
9276 bfd_vma * chains = NULL;
9277 bfd_vma ngnubuckets = 0;
9278 bfd_vma * gnubuckets = NULL;
9279 bfd_vma * gnuchains = NULL;
9280 bfd_vma gnusymidx = 0;
9281
9282 if (!do_syms && !do_dyn_syms && !do_histogram)
9283 return 1;
9284
9285 if (dynamic_info[DT_HASH]
9286 && (do_histogram
9287 || (do_using_dynamic
9288 && !do_dyn_syms
9289 && dynamic_strings != NULL)))
9290 {
9291 unsigned char nb[8];
9292 unsigned char nc[8];
9293 int hash_ent_size = 4;
9294
9295 if ((elf_header.e_machine == EM_ALPHA
9296 || elf_header.e_machine == EM_S390
9297 || elf_header.e_machine == EM_S390_OLD)
9298 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9299 hash_ent_size = 8;
9300
9301 if (fseek (file,
9302 (archive_file_offset
9303 + offset_from_vma (file, dynamic_info[DT_HASH],
9304 sizeof nb + sizeof nc)),
9305 SEEK_SET))
9306 {
9307 error (_("Unable to seek to start of dynamic information\n"));
9308 goto no_hash;
9309 }
9310
9311 if (fread (nb, hash_ent_size, 1, file) != 1)
9312 {
9313 error (_("Failed to read in number of buckets\n"));
9314 goto no_hash;
9315 }
9316
9317 if (fread (nc, hash_ent_size, 1, file) != 1)
9318 {
9319 error (_("Failed to read in number of chains\n"));
9320 goto no_hash;
9321 }
9322
9323 nbuckets = byte_get (nb, hash_ent_size);
9324 nchains = byte_get (nc, hash_ent_size);
9325
9326 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9327 chains = get_dynamic_data (file, nchains, hash_ent_size);
9328
9329 no_hash:
9330 if (buckets == NULL || chains == NULL)
9331 {
9332 if (do_using_dynamic)
9333 return 0;
9334 free (buckets);
9335 free (chains);
9336 buckets = NULL;
9337 chains = NULL;
9338 nbuckets = 0;
9339 nchains = 0;
9340 }
9341 }
9342
9343 if (dynamic_info_DT_GNU_HASH
9344 && (do_histogram
9345 || (do_using_dynamic
9346 && !do_dyn_syms
9347 && dynamic_strings != NULL)))
9348 {
9349 unsigned char nb[16];
9350 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9351 bfd_vma buckets_vma;
9352
9353 if (fseek (file,
9354 (archive_file_offset
9355 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9356 sizeof nb)),
9357 SEEK_SET))
9358 {
9359 error (_("Unable to seek to start of dynamic information\n"));
9360 goto no_gnu_hash;
9361 }
9362
9363 if (fread (nb, 16, 1, file) != 1)
9364 {
9365 error (_("Failed to read in number of buckets\n"));
9366 goto no_gnu_hash;
9367 }
9368
9369 ngnubuckets = byte_get (nb, 4);
9370 gnusymidx = byte_get (nb + 4, 4);
9371 bitmaskwords = byte_get (nb + 8, 4);
9372 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9373 if (is_32bit_elf)
9374 buckets_vma += bitmaskwords * 4;
9375 else
9376 buckets_vma += bitmaskwords * 8;
9377
9378 if (fseek (file,
9379 (archive_file_offset
9380 + offset_from_vma (file, buckets_vma, 4)),
9381 SEEK_SET))
9382 {
9383 error (_("Unable to seek to start of dynamic information\n"));
9384 goto no_gnu_hash;
9385 }
9386
9387 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9388
9389 if (gnubuckets == NULL)
9390 goto no_gnu_hash;
9391
9392 for (i = 0; i < ngnubuckets; i++)
9393 if (gnubuckets[i] != 0)
9394 {
9395 if (gnubuckets[i] < gnusymidx)
9396 return 0;
9397
9398 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9399 maxchain = gnubuckets[i];
9400 }
9401
9402 if (maxchain == 0xffffffff)
9403 goto no_gnu_hash;
9404
9405 maxchain -= gnusymidx;
9406
9407 if (fseek (file,
9408 (archive_file_offset
9409 + offset_from_vma (file, buckets_vma
9410 + 4 * (ngnubuckets + maxchain), 4)),
9411 SEEK_SET))
9412 {
9413 error (_("Unable to seek to start of dynamic information\n"));
9414 goto no_gnu_hash;
9415 }
9416
9417 do
9418 {
9419 if (fread (nb, 4, 1, file) != 1)
9420 {
9421 error (_("Failed to determine last chain length\n"));
9422 goto no_gnu_hash;
9423 }
9424
9425 if (maxchain + 1 == 0)
9426 goto no_gnu_hash;
9427
9428 ++maxchain;
9429 }
9430 while ((byte_get (nb, 4) & 1) == 0);
9431
9432 if (fseek (file,
9433 (archive_file_offset
9434 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9435 SEEK_SET))
9436 {
9437 error (_("Unable to seek to start of dynamic information\n"));
9438 goto no_gnu_hash;
9439 }
9440
9441 gnuchains = get_dynamic_data (file, maxchain, 4);
9442
9443 no_gnu_hash:
9444 if (gnuchains == NULL)
9445 {
9446 free (gnubuckets);
9447 gnubuckets = NULL;
9448 ngnubuckets = 0;
9449 if (do_using_dynamic)
9450 return 0;
9451 }
9452 }
9453
9454 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9455 && do_syms
9456 && do_using_dynamic
9457 && dynamic_strings != NULL)
9458 {
9459 unsigned long hn;
9460
9461 if (dynamic_info[DT_HASH])
9462 {
9463 bfd_vma si;
9464
9465 printf (_("\nSymbol table for image:\n"));
9466 if (is_32bit_elf)
9467 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9468 else
9469 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9470
9471 for (hn = 0; hn < nbuckets; hn++)
9472 {
9473 if (! buckets[hn])
9474 continue;
9475
9476 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9477 print_dynamic_symbol (si, hn);
9478 }
9479 }
9480
9481 if (dynamic_info_DT_GNU_HASH)
9482 {
9483 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9484 if (is_32bit_elf)
9485 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9486 else
9487 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9488
9489 for (hn = 0; hn < ngnubuckets; ++hn)
9490 if (gnubuckets[hn] != 0)
9491 {
9492 bfd_vma si = gnubuckets[hn];
9493 bfd_vma off = si - gnusymidx;
9494
9495 do
9496 {
9497 print_dynamic_symbol (si, hn);
9498 si++;
9499 }
9500 while ((gnuchains[off++] & 1) == 0);
9501 }
9502 }
9503 }
9504 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9505 {
9506 unsigned int i;
9507
9508 for (i = 0, section = section_headers;
9509 i < elf_header.e_shnum;
9510 i++, section++)
9511 {
9512 unsigned int si;
9513 char * strtab = NULL;
9514 unsigned long int strtab_size = 0;
9515 Elf_Internal_Sym * symtab;
9516 Elf_Internal_Sym * psym;
9517 unsigned long num_syms;
9518
9519 if ((section->sh_type != SHT_SYMTAB
9520 && section->sh_type != SHT_DYNSYM)
9521 || (!do_syms
9522 && section->sh_type == SHT_SYMTAB))
9523 continue;
9524
9525 if (section->sh_entsize == 0)
9526 {
9527 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9528 SECTION_NAME (section));
9529 continue;
9530 }
9531
9532 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9533 SECTION_NAME (section),
9534 (unsigned long) (section->sh_size / section->sh_entsize));
9535
9536 if (is_32bit_elf)
9537 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9538 else
9539 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9540
9541 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9542 if (symtab == NULL)
9543 continue;
9544
9545 if (section->sh_link == elf_header.e_shstrndx)
9546 {
9547 strtab = string_table;
9548 strtab_size = string_table_length;
9549 }
9550 else if (section->sh_link < elf_header.e_shnum)
9551 {
9552 Elf_Internal_Shdr * string_sec;
9553
9554 string_sec = section_headers + section->sh_link;
9555
9556 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9557 1, string_sec->sh_size,
9558 _("string table"));
9559 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9560 }
9561
9562 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9563 {
9564 printf ("%6d: ", si);
9565 print_vma (psym->st_value, LONG_HEX);
9566 putchar (' ');
9567 print_vma (psym->st_size, DEC_5);
9568 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9569 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9570 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9571 /* Check to see if any other bits in the st_other field are set.
9572 Note - displaying this information disrupts the layout of the
9573 table being generated, but for the moment this case is very rare. */
9574 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9575 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9576 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9577 print_symbol (25, psym->st_name < strtab_size
9578 ? strtab + psym->st_name : _("<corrupt>"));
9579
9580 if (section->sh_type == SHT_DYNSYM
9581 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9582 {
9583 unsigned char data[2];
9584 unsigned short vers_data;
9585 unsigned long offset;
9586 int is_nobits;
9587 int check_def;
9588
9589 offset = offset_from_vma
9590 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9591 sizeof data + si * sizeof (vers_data));
9592
9593 if (get_data (&data, file, offset + si * sizeof (vers_data),
9594 sizeof (data), 1, _("version data")) == NULL)
9595 break;
9596
9597 vers_data = byte_get (data, 2);
9598
9599 is_nobits = (psym->st_shndx < elf_header.e_shnum
9600 && section_headers[psym->st_shndx].sh_type
9601 == SHT_NOBITS);
9602
9603 check_def = (psym->st_shndx != SHN_UNDEF);
9604
9605 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9606 {
9607 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9608 && (is_nobits || ! check_def))
9609 {
9610 Elf_External_Verneed evn;
9611 Elf_Internal_Verneed ivn;
9612 Elf_Internal_Vernaux ivna;
9613
9614 /* We must test both. */
9615 offset = offset_from_vma
9616 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9617 sizeof evn);
9618
9619 do
9620 {
9621 unsigned long vna_off;
9622
9623 if (get_data (&evn, file, offset, sizeof (evn), 1,
9624 _("version need")) == NULL)
9625 {
9626 ivna.vna_next = 0;
9627 ivna.vna_other = 0;
9628 ivna.vna_name = 0;
9629 break;
9630 }
9631
9632 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9633 ivn.vn_next = BYTE_GET (evn.vn_next);
9634
9635 vna_off = offset + ivn.vn_aux;
9636
9637 do
9638 {
9639 Elf_External_Vernaux evna;
9640
9641 if (get_data (&evna, file, vna_off,
9642 sizeof (evna), 1,
9643 _("version need aux (3)")) == NULL)
9644 {
9645 ivna.vna_next = 0;
9646 ivna.vna_other = 0;
9647 ivna.vna_name = 0;
9648 }
9649 else
9650 {
9651 ivna.vna_other = BYTE_GET (evna.vna_other);
9652 ivna.vna_next = BYTE_GET (evna.vna_next);
9653 ivna.vna_name = BYTE_GET (evna.vna_name);
9654 }
9655
9656 vna_off += ivna.vna_next;
9657 }
9658 while (ivna.vna_other != vers_data
9659 && ivna.vna_next != 0);
9660
9661 if (ivna.vna_other == vers_data)
9662 break;
9663
9664 offset += ivn.vn_next;
9665 }
9666 while (ivn.vn_next != 0);
9667
9668 if (ivna.vna_other == vers_data)
9669 {
9670 printf ("@%s (%d)",
9671 ivna.vna_name < strtab_size
9672 ? strtab + ivna.vna_name : _("<corrupt>"),
9673 ivna.vna_other);
9674 check_def = 0;
9675 }
9676 else if (! is_nobits)
9677 error (_("bad dynamic symbol\n"));
9678 else
9679 check_def = 1;
9680 }
9681
9682 if (check_def)
9683 {
9684 if (vers_data != 0x8001
9685 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9686 {
9687 Elf_Internal_Verdef ivd;
9688 Elf_Internal_Verdaux ivda;
9689 Elf_External_Verdaux evda;
9690 unsigned long off;
9691
9692 off = offset_from_vma
9693 (file,
9694 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9695 sizeof (Elf_External_Verdef));
9696
9697 do
9698 {
9699 Elf_External_Verdef evd;
9700
9701 if (get_data (&evd, file, off, sizeof (evd),
9702 1, _("version def")) == NULL)
9703 {
9704 ivd.vd_ndx = 0;
9705 ivd.vd_aux = 0;
9706 ivd.vd_next = 0;
9707 }
9708 else
9709 {
9710 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9711 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9712 ivd.vd_next = BYTE_GET (evd.vd_next);
9713 }
9714
9715 off += ivd.vd_next;
9716 }
9717 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9718 && ivd.vd_next != 0);
9719
9720 off -= ivd.vd_next;
9721 off += ivd.vd_aux;
9722
9723 if (get_data (&evda, file, off, sizeof (evda),
9724 1, _("version def aux")) == NULL)
9725 break;
9726
9727 ivda.vda_name = BYTE_GET (evda.vda_name);
9728
9729 if (psym->st_name != ivda.vda_name)
9730 printf ((vers_data & VERSYM_HIDDEN)
9731 ? "@%s" : "@@%s",
9732 ivda.vda_name < strtab_size
9733 ? strtab + ivda.vda_name : _("<corrupt>"));
9734 }
9735 }
9736 }
9737 }
9738
9739 putchar ('\n');
9740 }
9741
9742 free (symtab);
9743 if (strtab != string_table)
9744 free (strtab);
9745 }
9746 }
9747 else if (do_syms)
9748 printf
9749 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9750
9751 if (do_histogram && buckets != NULL)
9752 {
9753 unsigned long * lengths;
9754 unsigned long * counts;
9755 unsigned long hn;
9756 bfd_vma si;
9757 unsigned long maxlength = 0;
9758 unsigned long nzero_counts = 0;
9759 unsigned long nsyms = 0;
9760
9761 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9762 (unsigned long) nbuckets);
9763 printf (_(" Length Number %% of total Coverage\n"));
9764
9765 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9766 if (lengths == NULL)
9767 {
9768 error (_("Out of memory\n"));
9769 return 0;
9770 }
9771 for (hn = 0; hn < nbuckets; ++hn)
9772 {
9773 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9774 {
9775 ++nsyms;
9776 if (maxlength < ++lengths[hn])
9777 ++maxlength;
9778 }
9779 }
9780
9781 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9782 if (counts == NULL)
9783 {
9784 error (_("Out of memory\n"));
9785 return 0;
9786 }
9787
9788 for (hn = 0; hn < nbuckets; ++hn)
9789 ++counts[lengths[hn]];
9790
9791 if (nbuckets > 0)
9792 {
9793 unsigned long i;
9794 printf (" 0 %-10lu (%5.1f%%)\n",
9795 counts[0], (counts[0] * 100.0) / nbuckets);
9796 for (i = 1; i <= maxlength; ++i)
9797 {
9798 nzero_counts += counts[i] * i;
9799 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9800 i, counts[i], (counts[i] * 100.0) / nbuckets,
9801 (nzero_counts * 100.0) / nsyms);
9802 }
9803 }
9804
9805 free (counts);
9806 free (lengths);
9807 }
9808
9809 if (buckets != NULL)
9810 {
9811 free (buckets);
9812 free (chains);
9813 }
9814
9815 if (do_histogram && gnubuckets != NULL)
9816 {
9817 unsigned long * lengths;
9818 unsigned long * counts;
9819 unsigned long hn;
9820 unsigned long maxlength = 0;
9821 unsigned long nzero_counts = 0;
9822 unsigned long nsyms = 0;
9823
9824 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9825 if (lengths == NULL)
9826 {
9827 error (_("Out of memory\n"));
9828 return 0;
9829 }
9830
9831 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9832 (unsigned long) ngnubuckets);
9833 printf (_(" Length Number %% of total Coverage\n"));
9834
9835 for (hn = 0; hn < ngnubuckets; ++hn)
9836 if (gnubuckets[hn] != 0)
9837 {
9838 bfd_vma off, length = 1;
9839
9840 for (off = gnubuckets[hn] - gnusymidx;
9841 (gnuchains[off] & 1) == 0; ++off)
9842 ++length;
9843 lengths[hn] = length;
9844 if (length > maxlength)
9845 maxlength = length;
9846 nsyms += length;
9847 }
9848
9849 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9850 if (counts == NULL)
9851 {
9852 error (_("Out of memory\n"));
9853 return 0;
9854 }
9855
9856 for (hn = 0; hn < ngnubuckets; ++hn)
9857 ++counts[lengths[hn]];
9858
9859 if (ngnubuckets > 0)
9860 {
9861 unsigned long j;
9862 printf (" 0 %-10lu (%5.1f%%)\n",
9863 counts[0], (counts[0] * 100.0) / ngnubuckets);
9864 for (j = 1; j <= maxlength; ++j)
9865 {
9866 nzero_counts += counts[j] * j;
9867 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9868 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9869 (nzero_counts * 100.0) / nsyms);
9870 }
9871 }
9872
9873 free (counts);
9874 free (lengths);
9875 free (gnubuckets);
9876 free (gnuchains);
9877 }
9878
9879 return 1;
9880 }
9881
9882 static int
9883 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9884 {
9885 unsigned int i;
9886
9887 if (dynamic_syminfo == NULL
9888 || !do_dynamic)
9889 /* No syminfo, this is ok. */
9890 return 1;
9891
9892 /* There better should be a dynamic symbol section. */
9893 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9894 return 0;
9895
9896 if (dynamic_addr)
9897 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9898 dynamic_syminfo_offset, dynamic_syminfo_nent);
9899
9900 printf (_(" Num: Name BoundTo Flags\n"));
9901 for (i = 0; i < dynamic_syminfo_nent; ++i)
9902 {
9903 unsigned short int flags = dynamic_syminfo[i].si_flags;
9904
9905 printf ("%4d: ", i);
9906 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9907 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9908 else
9909 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9910 putchar (' ');
9911
9912 switch (dynamic_syminfo[i].si_boundto)
9913 {
9914 case SYMINFO_BT_SELF:
9915 fputs ("SELF ", stdout);
9916 break;
9917 case SYMINFO_BT_PARENT:
9918 fputs ("PARENT ", stdout);
9919 break;
9920 default:
9921 if (dynamic_syminfo[i].si_boundto > 0
9922 && dynamic_syminfo[i].si_boundto < dynamic_nent
9923 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9924 {
9925 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9926 putchar (' ' );
9927 }
9928 else
9929 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9930 break;
9931 }
9932
9933 if (flags & SYMINFO_FLG_DIRECT)
9934 printf (" DIRECT");
9935 if (flags & SYMINFO_FLG_PASSTHRU)
9936 printf (" PASSTHRU");
9937 if (flags & SYMINFO_FLG_COPY)
9938 printf (" COPY");
9939 if (flags & SYMINFO_FLG_LAZYLOAD)
9940 printf (" LAZYLOAD");
9941
9942 puts ("");
9943 }
9944
9945 return 1;
9946 }
9947
9948 /* Check to see if the given reloc needs to be handled in a target specific
9949 manner. If so then process the reloc and return TRUE otherwise return
9950 FALSE. */
9951
9952 static bfd_boolean
9953 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9954 unsigned char * start,
9955 Elf_Internal_Sym * symtab)
9956 {
9957 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9958
9959 switch (elf_header.e_machine)
9960 {
9961 case EM_MN10300:
9962 case EM_CYGNUS_MN10300:
9963 {
9964 static Elf_Internal_Sym * saved_sym = NULL;
9965
9966 switch (reloc_type)
9967 {
9968 case 34: /* R_MN10300_ALIGN */
9969 return TRUE;
9970 case 33: /* R_MN10300_SYM_DIFF */
9971 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9972 return TRUE;
9973 case 1: /* R_MN10300_32 */
9974 case 2: /* R_MN10300_16 */
9975 if (saved_sym != NULL)
9976 {
9977 bfd_vma value;
9978
9979 value = reloc->r_addend
9980 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9981 - saved_sym->st_value);
9982
9983 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9984
9985 saved_sym = NULL;
9986 return TRUE;
9987 }
9988 break;
9989 default:
9990 if (saved_sym != NULL)
9991 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9992 break;
9993 }
9994 break;
9995 }
9996 }
9997
9998 return FALSE;
9999 }
10000
10001 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10002 DWARF debug sections. This is a target specific test. Note - we do not
10003 go through the whole including-target-headers-multiple-times route, (as
10004 we have already done with <elf/h8.h>) because this would become very
10005 messy and even then this function would have to contain target specific
10006 information (the names of the relocs instead of their numeric values).
10007 FIXME: This is not the correct way to solve this problem. The proper way
10008 is to have target specific reloc sizing and typing functions created by
10009 the reloc-macros.h header, in the same way that it already creates the
10010 reloc naming functions. */
10011
10012 static bfd_boolean
10013 is_32bit_abs_reloc (unsigned int reloc_type)
10014 {
10015 switch (elf_header.e_machine)
10016 {
10017 case EM_386:
10018 case EM_486:
10019 return reloc_type == 1; /* R_386_32. */
10020 case EM_68K:
10021 return reloc_type == 1; /* R_68K_32. */
10022 case EM_860:
10023 return reloc_type == 1; /* R_860_32. */
10024 case EM_960:
10025 return reloc_type == 2; /* R_960_32. */
10026 case EM_AARCH64:
10027 return reloc_type == 258; /* R_AARCH64_ABS32 */
10028 case EM_ALPHA:
10029 return reloc_type == 1; /* R_ALPHA_REFLONG. */
10030 case EM_ARC:
10031 return reloc_type == 1; /* R_ARC_32. */
10032 case EM_ARM:
10033 return reloc_type == 2; /* R_ARM_ABS32 */
10034 case EM_AVR_OLD:
10035 case EM_AVR:
10036 return reloc_type == 1;
10037 case EM_ADAPTEVA_EPIPHANY:
10038 return reloc_type == 3;
10039 case EM_BLACKFIN:
10040 return reloc_type == 0x12; /* R_byte4_data. */
10041 case EM_CRIS:
10042 return reloc_type == 3; /* R_CRIS_32. */
10043 case EM_CR16:
10044 return reloc_type == 3; /* R_CR16_NUM32. */
10045 case EM_CRX:
10046 return reloc_type == 15; /* R_CRX_NUM32. */
10047 case EM_CYGNUS_FRV:
10048 return reloc_type == 1;
10049 case EM_CYGNUS_D10V:
10050 case EM_D10V:
10051 return reloc_type == 6; /* R_D10V_32. */
10052 case EM_CYGNUS_D30V:
10053 case EM_D30V:
10054 return reloc_type == 12; /* R_D30V_32_NORMAL. */
10055 case EM_DLX:
10056 return reloc_type == 3; /* R_DLX_RELOC_32. */
10057 case EM_CYGNUS_FR30:
10058 case EM_FR30:
10059 return reloc_type == 3; /* R_FR30_32. */
10060 case EM_H8S:
10061 case EM_H8_300:
10062 case EM_H8_300H:
10063 return reloc_type == 1; /* R_H8_DIR32. */
10064 case EM_IA_64:
10065 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
10066 case EM_IP2K_OLD:
10067 case EM_IP2K:
10068 return reloc_type == 2; /* R_IP2K_32. */
10069 case EM_IQ2000:
10070 return reloc_type == 2; /* R_IQ2000_32. */
10071 case EM_LATTICEMICO32:
10072 return reloc_type == 3; /* R_LM32_32. */
10073 case EM_M32C_OLD:
10074 case EM_M32C:
10075 return reloc_type == 3; /* R_M32C_32. */
10076 case EM_M32R:
10077 return reloc_type == 34; /* R_M32R_32_RELA. */
10078 case EM_MCORE:
10079 return reloc_type == 1; /* R_MCORE_ADDR32. */
10080 case EM_CYGNUS_MEP:
10081 return reloc_type == 4; /* R_MEP_32. */
10082 case EM_METAG:
10083 return reloc_type == 2; /* R_METAG_ADDR32. */
10084 case EM_MICROBLAZE:
10085 return reloc_type == 1; /* R_MICROBLAZE_32. */
10086 case EM_MIPS:
10087 return reloc_type == 2; /* R_MIPS_32. */
10088 case EM_MMIX:
10089 return reloc_type == 4; /* R_MMIX_32. */
10090 case EM_CYGNUS_MN10200:
10091 case EM_MN10200:
10092 return reloc_type == 1; /* R_MN10200_32. */
10093 case EM_CYGNUS_MN10300:
10094 case EM_MN10300:
10095 return reloc_type == 1; /* R_MN10300_32. */
10096 case EM_MOXIE:
10097 return reloc_type == 1; /* R_MOXIE_32. */
10098 case EM_MSP430_OLD:
10099 case EM_MSP430:
10100 return reloc_type == 1; /* R_MSP43_32. */
10101 case EM_MT:
10102 return reloc_type == 2; /* R_MT_32. */
10103 case EM_ALTERA_NIOS2:
10104 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
10105 case EM_NIOS32:
10106 return reloc_type == 1; /* R_NIOS_32. */
10107 case EM_OPENRISC:
10108 case EM_OR32:
10109 return reloc_type == 1; /* R_OR32_32. */
10110 case EM_PARISC:
10111 return (reloc_type == 1 /* R_PARISC_DIR32. */
10112 || reloc_type == 41); /* R_PARISC_SECREL32. */
10113 case EM_PJ:
10114 case EM_PJ_OLD:
10115 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
10116 case EM_PPC64:
10117 return reloc_type == 1; /* R_PPC64_ADDR32. */
10118 case EM_PPC:
10119 return reloc_type == 1; /* R_PPC_ADDR32. */
10120 case EM_RL78:
10121 return reloc_type == 1; /* R_RL78_DIR32. */
10122 case EM_RX:
10123 return reloc_type == 1; /* R_RX_DIR32. */
10124 case EM_S370:
10125 return reloc_type == 1; /* R_I370_ADDR31. */
10126 case EM_S390_OLD:
10127 case EM_S390:
10128 return reloc_type == 4; /* R_S390_32. */
10129 case EM_SCORE:
10130 return reloc_type == 8; /* R_SCORE_ABS32. */
10131 case EM_SH:
10132 return reloc_type == 1; /* R_SH_DIR32. */
10133 case EM_SPARC32PLUS:
10134 case EM_SPARCV9:
10135 case EM_SPARC:
10136 return reloc_type == 3 /* R_SPARC_32. */
10137 || reloc_type == 23; /* R_SPARC_UA32. */
10138 case EM_SPU:
10139 return reloc_type == 6; /* R_SPU_ADDR32 */
10140 case EM_TI_C6000:
10141 return reloc_type == 1; /* R_C6000_ABS32. */
10142 case EM_TILEGX:
10143 return reloc_type == 2; /* R_TILEGX_32. */
10144 case EM_TILEPRO:
10145 return reloc_type == 1; /* R_TILEPRO_32. */
10146 case EM_CYGNUS_V850:
10147 case EM_V850:
10148 return reloc_type == 6; /* R_V850_ABS32. */
10149 case EM_V800:
10150 return reloc_type == 0x33; /* R_V810_WORD. */
10151 case EM_VAX:
10152 return reloc_type == 1; /* R_VAX_32. */
10153 case EM_X86_64:
10154 case EM_L1OM:
10155 case EM_K1OM:
10156 return reloc_type == 10; /* R_X86_64_32. */
10157 case EM_XC16X:
10158 case EM_C166:
10159 return reloc_type == 3; /* R_XC16C_ABS_32. */
10160 case EM_XGATE:
10161 return reloc_type == 4; /* R_XGATE_32. */
10162 case EM_XSTORMY16:
10163 return reloc_type == 1; /* R_XSTROMY16_32. */
10164 case EM_XTENSA_OLD:
10165 case EM_XTENSA:
10166 return reloc_type == 1; /* R_XTENSA_32. */
10167 default:
10168 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10169 elf_header.e_machine);
10170 abort ();
10171 }
10172 }
10173
10174 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10175 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
10176
10177 static bfd_boolean
10178 is_32bit_pcrel_reloc (unsigned int reloc_type)
10179 {
10180 switch (elf_header.e_machine)
10181 {
10182 case EM_386:
10183 case EM_486:
10184 return reloc_type == 2; /* R_386_PC32. */
10185 case EM_68K:
10186 return reloc_type == 4; /* R_68K_PC32. */
10187 case EM_AARCH64:
10188 return reloc_type == 261; /* R_AARCH64_PREL32 */
10189 case EM_ADAPTEVA_EPIPHANY:
10190 return reloc_type == 6;
10191 case EM_ALPHA:
10192 return reloc_type == 10; /* R_ALPHA_SREL32. */
10193 case EM_ARM:
10194 return reloc_type == 3; /* R_ARM_REL32 */
10195 case EM_MICROBLAZE:
10196 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
10197 case EM_PARISC:
10198 return reloc_type == 9; /* R_PARISC_PCREL32. */
10199 case EM_PPC:
10200 return reloc_type == 26; /* R_PPC_REL32. */
10201 case EM_PPC64:
10202 return reloc_type == 26; /* R_PPC64_REL32. */
10203 case EM_S390_OLD:
10204 case EM_S390:
10205 return reloc_type == 5; /* R_390_PC32. */
10206 case EM_SH:
10207 return reloc_type == 2; /* R_SH_REL32. */
10208 case EM_SPARC32PLUS:
10209 case EM_SPARCV9:
10210 case EM_SPARC:
10211 return reloc_type == 6; /* R_SPARC_DISP32. */
10212 case EM_SPU:
10213 return reloc_type == 13; /* R_SPU_REL32. */
10214 case EM_TILEGX:
10215 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
10216 case EM_TILEPRO:
10217 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
10218 case EM_X86_64:
10219 case EM_L1OM:
10220 case EM_K1OM:
10221 return reloc_type == 2; /* R_X86_64_PC32. */
10222 case EM_XTENSA_OLD:
10223 case EM_XTENSA:
10224 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
10225 default:
10226 /* Do not abort or issue an error message here. Not all targets use
10227 pc-relative 32-bit relocs in their DWARF debug information and we
10228 have already tested for target coverage in is_32bit_abs_reloc. A
10229 more helpful warning message will be generated by apply_relocations
10230 anyway, so just return. */
10231 return FALSE;
10232 }
10233 }
10234
10235 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10236 a 64-bit absolute RELA relocation used in DWARF debug sections. */
10237
10238 static bfd_boolean
10239 is_64bit_abs_reloc (unsigned int reloc_type)
10240 {
10241 switch (elf_header.e_machine)
10242 {
10243 case EM_AARCH64:
10244 return reloc_type == 257; /* R_AARCH64_ABS64. */
10245 case EM_ALPHA:
10246 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
10247 case EM_IA_64:
10248 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
10249 case EM_PARISC:
10250 return reloc_type == 80; /* R_PARISC_DIR64. */
10251 case EM_PPC64:
10252 return reloc_type == 38; /* R_PPC64_ADDR64. */
10253 case EM_SPARC32PLUS:
10254 case EM_SPARCV9:
10255 case EM_SPARC:
10256 return reloc_type == 54; /* R_SPARC_UA64. */
10257 case EM_X86_64:
10258 case EM_L1OM:
10259 case EM_K1OM:
10260 return reloc_type == 1; /* R_X86_64_64. */
10261 case EM_S390_OLD:
10262 case EM_S390:
10263 return reloc_type == 22; /* R_S390_64. */
10264 case EM_TILEGX:
10265 return reloc_type == 1; /* R_TILEGX_64. */
10266 case EM_MIPS:
10267 return reloc_type == 18; /* R_MIPS_64. */
10268 default:
10269 return FALSE;
10270 }
10271 }
10272
10273 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10274 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
10275
10276 static bfd_boolean
10277 is_64bit_pcrel_reloc (unsigned int reloc_type)
10278 {
10279 switch (elf_header.e_machine)
10280 {
10281 case EM_AARCH64:
10282 return reloc_type == 260; /* R_AARCH64_PREL64. */
10283 case EM_ALPHA:
10284 return reloc_type == 11; /* R_ALPHA_SREL64. */
10285 case EM_IA_64:
10286 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
10287 case EM_PARISC:
10288 return reloc_type == 72; /* R_PARISC_PCREL64. */
10289 case EM_PPC64:
10290 return reloc_type == 44; /* R_PPC64_REL64. */
10291 case EM_SPARC32PLUS:
10292 case EM_SPARCV9:
10293 case EM_SPARC:
10294 return reloc_type == 46; /* R_SPARC_DISP64. */
10295 case EM_X86_64:
10296 case EM_L1OM:
10297 case EM_K1OM:
10298 return reloc_type == 24; /* R_X86_64_PC64. */
10299 case EM_S390_OLD:
10300 case EM_S390:
10301 return reloc_type == 23; /* R_S390_PC64. */
10302 case EM_TILEGX:
10303 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
10304 default:
10305 return FALSE;
10306 }
10307 }
10308
10309 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10310 a 24-bit absolute RELA relocation used in DWARF debug sections. */
10311
10312 static bfd_boolean
10313 is_24bit_abs_reloc (unsigned int reloc_type)
10314 {
10315 switch (elf_header.e_machine)
10316 {
10317 case EM_CYGNUS_MN10200:
10318 case EM_MN10200:
10319 return reloc_type == 4; /* R_MN10200_24. */
10320 default:
10321 return FALSE;
10322 }
10323 }
10324
10325 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10326 a 16-bit absolute RELA relocation used in DWARF debug sections. */
10327
10328 static bfd_boolean
10329 is_16bit_abs_reloc (unsigned int reloc_type)
10330 {
10331 switch (elf_header.e_machine)
10332 {
10333 case EM_AVR_OLD:
10334 case EM_AVR:
10335 return reloc_type == 4; /* R_AVR_16. */
10336 case EM_ADAPTEVA_EPIPHANY:
10337 return reloc_type == 5;
10338 case EM_CYGNUS_D10V:
10339 case EM_D10V:
10340 return reloc_type == 3; /* R_D10V_16. */
10341 case EM_H8S:
10342 case EM_H8_300:
10343 case EM_H8_300H:
10344 return reloc_type == R_H8_DIR16;
10345 case EM_IP2K_OLD:
10346 case EM_IP2K:
10347 return reloc_type == 1; /* R_IP2K_16. */
10348 case EM_M32C_OLD:
10349 case EM_M32C:
10350 return reloc_type == 1; /* R_M32C_16 */
10351 case EM_MSP430:
10352 case EM_MSP430_OLD:
10353 return reloc_type == 5; /* R_MSP430_16_BYTE. */
10354 case EM_ALTERA_NIOS2:
10355 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
10356 case EM_NIOS32:
10357 return reloc_type == 9; /* R_NIOS_16. */
10358 case EM_TI_C6000:
10359 return reloc_type == 2; /* R_C6000_ABS16. */
10360 case EM_XC16X:
10361 case EM_C166:
10362 return reloc_type == 2; /* R_XC16C_ABS_16. */
10363 case EM_CYGNUS_MN10200:
10364 case EM_MN10200:
10365 return reloc_type == 2; /* R_MN10200_16. */
10366 case EM_CYGNUS_MN10300:
10367 case EM_MN10300:
10368 return reloc_type == 2; /* R_MN10300_16. */
10369 case EM_XGATE:
10370 return reloc_type == 3; /* R_XGATE_16. */
10371 default:
10372 return FALSE;
10373 }
10374 }
10375
10376 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10377 relocation entries (possibly formerly used for SHT_GROUP sections). */
10378
10379 static bfd_boolean
10380 is_none_reloc (unsigned int reloc_type)
10381 {
10382 switch (elf_header.e_machine)
10383 {
10384 case EM_68K: /* R_68K_NONE. */
10385 case EM_386: /* R_386_NONE. */
10386 case EM_SPARC32PLUS:
10387 case EM_SPARCV9:
10388 case EM_SPARC: /* R_SPARC_NONE. */
10389 case EM_MIPS: /* R_MIPS_NONE. */
10390 case EM_PARISC: /* R_PARISC_NONE. */
10391 case EM_ALPHA: /* R_ALPHA_NONE. */
10392 case EM_ADAPTEVA_EPIPHANY:
10393 case EM_PPC: /* R_PPC_NONE. */
10394 case EM_PPC64: /* R_PPC64_NONE. */
10395 case EM_ARM: /* R_ARM_NONE. */
10396 case EM_IA_64: /* R_IA64_NONE. */
10397 case EM_SH: /* R_SH_NONE. */
10398 case EM_S390_OLD:
10399 case EM_S390: /* R_390_NONE. */
10400 case EM_CRIS: /* R_CRIS_NONE. */
10401 case EM_X86_64: /* R_X86_64_NONE. */
10402 case EM_L1OM: /* R_X86_64_NONE. */
10403 case EM_K1OM: /* R_X86_64_NONE. */
10404 case EM_MN10300: /* R_MN10300_NONE. */
10405 case EM_MOXIE: /* R_MOXIE_NONE. */
10406 case EM_M32R: /* R_M32R_NONE. */
10407 case EM_TI_C6000:/* R_C6000_NONE. */
10408 case EM_TILEGX: /* R_TILEGX_NONE. */
10409 case EM_TILEPRO: /* R_TILEPRO_NONE. */
10410 case EM_XC16X:
10411 case EM_C166: /* R_XC16X_NONE. */
10412 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
10413 case EM_NIOS32: /* R_NIOS_NONE. */
10414 return reloc_type == 0;
10415 case EM_AARCH64:
10416 return reloc_type == 0 || reloc_type == 256;
10417 case EM_XTENSA_OLD:
10418 case EM_XTENSA:
10419 return (reloc_type == 0 /* R_XTENSA_NONE. */
10420 || reloc_type == 17 /* R_XTENSA_DIFF8. */
10421 || reloc_type == 18 /* R_XTENSA_DIFF16. */
10422 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
10423 case EM_METAG:
10424 return reloc_type == 3; /* R_METAG_NONE. */
10425 }
10426 return FALSE;
10427 }
10428
10429 /* Apply relocations to a section.
10430 Note: So far support has been added only for those relocations
10431 which can be found in debug sections.
10432 FIXME: Add support for more relocations ? */
10433
10434 static void
10435 apply_relocations (void * file,
10436 Elf_Internal_Shdr * section,
10437 unsigned char * start)
10438 {
10439 Elf_Internal_Shdr * relsec;
10440 unsigned char * end = start + section->sh_size;
10441
10442 if (elf_header.e_type != ET_REL)
10443 return;
10444
10445 /* Find the reloc section associated with the section. */
10446 for (relsec = section_headers;
10447 relsec < section_headers + elf_header.e_shnum;
10448 ++relsec)
10449 {
10450 bfd_boolean is_rela;
10451 unsigned long num_relocs;
10452 Elf_Internal_Rela * relocs;
10453 Elf_Internal_Rela * rp;
10454 Elf_Internal_Shdr * symsec;
10455 Elf_Internal_Sym * symtab;
10456 unsigned long num_syms;
10457 Elf_Internal_Sym * sym;
10458
10459 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10460 || relsec->sh_info >= elf_header.e_shnum
10461 || section_headers + relsec->sh_info != section
10462 || relsec->sh_size == 0
10463 || relsec->sh_link >= elf_header.e_shnum)
10464 continue;
10465
10466 is_rela = relsec->sh_type == SHT_RELA;
10467
10468 if (is_rela)
10469 {
10470 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10471 relsec->sh_size, & relocs, & num_relocs))
10472 return;
10473 }
10474 else
10475 {
10476 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10477 relsec->sh_size, & relocs, & num_relocs))
10478 return;
10479 }
10480
10481 /* SH uses RELA but uses in place value instead of the addend field. */
10482 if (elf_header.e_machine == EM_SH)
10483 is_rela = FALSE;
10484
10485 symsec = section_headers + relsec->sh_link;
10486 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10487
10488 for (rp = relocs; rp < relocs + num_relocs; ++rp)
10489 {
10490 bfd_vma addend;
10491 unsigned int reloc_type;
10492 unsigned int reloc_size;
10493 unsigned char * rloc;
10494 unsigned long sym_index;
10495
10496 reloc_type = get_reloc_type (rp->r_info);
10497
10498 if (target_specific_reloc_handling (rp, start, symtab))
10499 continue;
10500 else if (is_none_reloc (reloc_type))
10501 continue;
10502 else if (is_32bit_abs_reloc (reloc_type)
10503 || is_32bit_pcrel_reloc (reloc_type))
10504 reloc_size = 4;
10505 else if (is_64bit_abs_reloc (reloc_type)
10506 || is_64bit_pcrel_reloc (reloc_type))
10507 reloc_size = 8;
10508 else if (is_24bit_abs_reloc (reloc_type))
10509 reloc_size = 3;
10510 else if (is_16bit_abs_reloc (reloc_type))
10511 reloc_size = 2;
10512 else
10513 {
10514 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10515 reloc_type, SECTION_NAME (section));
10516 continue;
10517 }
10518
10519 rloc = start + rp->r_offset;
10520 if ((rloc + reloc_size) > end || (rloc < start))
10521 {
10522 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10523 (unsigned long) rp->r_offset,
10524 SECTION_NAME (section));
10525 continue;
10526 }
10527
10528 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10529 if (sym_index >= num_syms)
10530 {
10531 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10532 sym_index, SECTION_NAME (section));
10533 continue;
10534 }
10535 sym = symtab + sym_index;
10536
10537 /* If the reloc has a symbol associated with it,
10538 make sure that it is of an appropriate type.
10539
10540 Relocations against symbols without type can happen.
10541 Gcc -feliminate-dwarf2-dups may generate symbols
10542 without type for debug info.
10543
10544 Icc generates relocations against function symbols
10545 instead of local labels.
10546
10547 Relocations against object symbols can happen, eg when
10548 referencing a global array. For an example of this see
10549 the _clz.o binary in libgcc.a. */
10550 if (sym != symtab
10551 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10552 {
10553 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10554 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10555 (long int)(rp - relocs),
10556 SECTION_NAME (relsec));
10557 continue;
10558 }
10559
10560 addend = 0;
10561 if (is_rela)
10562 addend += rp->r_addend;
10563 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10564 partial_inplace. */
10565 if (!is_rela
10566 || (elf_header.e_machine == EM_XTENSA
10567 && reloc_type == 1)
10568 || ((elf_header.e_machine == EM_PJ
10569 || elf_header.e_machine == EM_PJ_OLD)
10570 && reloc_type == 1)
10571 || ((elf_header.e_machine == EM_D30V
10572 || elf_header.e_machine == EM_CYGNUS_D30V)
10573 && reloc_type == 12))
10574 addend += byte_get (rloc, reloc_size);
10575
10576 if (is_32bit_pcrel_reloc (reloc_type)
10577 || is_64bit_pcrel_reloc (reloc_type))
10578 {
10579 /* On HPPA, all pc-relative relocations are biased by 8. */
10580 if (elf_header.e_machine == EM_PARISC)
10581 addend -= 8;
10582 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10583 reloc_size);
10584 }
10585 else
10586 byte_put (rloc, addend + sym->st_value, reloc_size);
10587 }
10588
10589 free (symtab);
10590 free (relocs);
10591 break;
10592 }
10593 }
10594
10595 #ifdef SUPPORT_DISASSEMBLY
10596 static int
10597 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10598 {
10599 printf (_("\nAssembly dump of section %s\n"),
10600 SECTION_NAME (section));
10601
10602 /* XXX -- to be done --- XXX */
10603
10604 return 1;
10605 }
10606 #endif
10607
10608 /* Reads in the contents of SECTION from FILE, returning a pointer
10609 to a malloc'ed buffer or NULL if something went wrong. */
10610
10611 static char *
10612 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10613 {
10614 bfd_size_type num_bytes;
10615
10616 num_bytes = section->sh_size;
10617
10618 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10619 {
10620 printf (_("\nSection '%s' has no data to dump.\n"),
10621 SECTION_NAME (section));
10622 return NULL;
10623 }
10624
10625 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10626 _("section contents"));
10627 }
10628
10629
10630 static void
10631 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10632 {
10633 Elf_Internal_Shdr * relsec;
10634 bfd_size_type num_bytes;
10635 char * data;
10636 char * end;
10637 char * start;
10638 char * name = SECTION_NAME (section);
10639 bfd_boolean some_strings_shown;
10640
10641 start = get_section_contents (section, file);
10642 if (start == NULL)
10643 return;
10644
10645 printf (_("\nString dump of section '%s':\n"), name);
10646
10647 /* If the section being dumped has relocations against it the user might
10648 be expecting these relocations to have been applied. Check for this
10649 case and issue a warning message in order to avoid confusion.
10650 FIXME: Maybe we ought to have an option that dumps a section with
10651 relocs applied ? */
10652 for (relsec = section_headers;
10653 relsec < section_headers + elf_header.e_shnum;
10654 ++relsec)
10655 {
10656 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10657 || relsec->sh_info >= elf_header.e_shnum
10658 || section_headers + relsec->sh_info != section
10659 || relsec->sh_size == 0
10660 || relsec->sh_link >= elf_header.e_shnum)
10661 continue;
10662
10663 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10664 break;
10665 }
10666
10667 num_bytes = section->sh_size;
10668 data = start;
10669 end = start + num_bytes;
10670 some_strings_shown = FALSE;
10671
10672 while (data < end)
10673 {
10674 while (!ISPRINT (* data))
10675 if (++ data >= end)
10676 break;
10677
10678 if (data < end)
10679 {
10680 #ifndef __MSVCRT__
10681 /* PR 11128: Use two separate invocations in order to work
10682 around bugs in the Solaris 8 implementation of printf. */
10683 printf (" [%6tx] ", data - start);
10684 printf ("%s\n", data);
10685 #else
10686 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
10687 #endif
10688 data += strlen (data);
10689 some_strings_shown = TRUE;
10690 }
10691 }
10692
10693 if (! some_strings_shown)
10694 printf (_(" No strings found in this section."));
10695
10696 free (start);
10697
10698 putchar ('\n');
10699 }
10700
10701 static void
10702 dump_section_as_bytes (Elf_Internal_Shdr * section,
10703 FILE * file,
10704 bfd_boolean relocate)
10705 {
10706 Elf_Internal_Shdr * relsec;
10707 bfd_size_type bytes;
10708 bfd_vma addr;
10709 unsigned char * data;
10710 unsigned char * start;
10711
10712 start = (unsigned char *) get_section_contents (section, file);
10713 if (start == NULL)
10714 return;
10715
10716 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10717
10718 if (relocate)
10719 {
10720 apply_relocations (file, section, start);
10721 }
10722 else
10723 {
10724 /* If the section being dumped has relocations against it the user might
10725 be expecting these relocations to have been applied. Check for this
10726 case and issue a warning message in order to avoid confusion.
10727 FIXME: Maybe we ought to have an option that dumps a section with
10728 relocs applied ? */
10729 for (relsec = section_headers;
10730 relsec < section_headers + elf_header.e_shnum;
10731 ++relsec)
10732 {
10733 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10734 || relsec->sh_info >= elf_header.e_shnum
10735 || section_headers + relsec->sh_info != section
10736 || relsec->sh_size == 0
10737 || relsec->sh_link >= elf_header.e_shnum)
10738 continue;
10739
10740 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10741 break;
10742 }
10743 }
10744
10745 addr = section->sh_addr;
10746 bytes = section->sh_size;
10747 data = start;
10748
10749 while (bytes)
10750 {
10751 int j;
10752 int k;
10753 int lbytes;
10754
10755 lbytes = (bytes > 16 ? 16 : bytes);
10756
10757 printf (" 0x%8.8lx ", (unsigned long) addr);
10758
10759 for (j = 0; j < 16; j++)
10760 {
10761 if (j < lbytes)
10762 printf ("%2.2x", data[j]);
10763 else
10764 printf (" ");
10765
10766 if ((j & 3) == 3)
10767 printf (" ");
10768 }
10769
10770 for (j = 0; j < lbytes; j++)
10771 {
10772 k = data[j];
10773 if (k >= ' ' && k < 0x7f)
10774 printf ("%c", k);
10775 else
10776 printf (".");
10777 }
10778
10779 putchar ('\n');
10780
10781 data += lbytes;
10782 addr += lbytes;
10783 bytes -= lbytes;
10784 }
10785
10786 free (start);
10787
10788 putchar ('\n');
10789 }
10790
10791 /* Uncompresses a section that was compressed using zlib, in place. */
10792
10793 static int
10794 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10795 dwarf_size_type *size ATTRIBUTE_UNUSED)
10796 {
10797 #ifndef HAVE_ZLIB_H
10798 return FALSE;
10799 #else
10800 dwarf_size_type compressed_size = *size;
10801 unsigned char * compressed_buffer = *buffer;
10802 dwarf_size_type uncompressed_size;
10803 unsigned char * uncompressed_buffer;
10804 z_stream strm;
10805 int rc;
10806 dwarf_size_type header_size = 12;
10807
10808 /* Read the zlib header. In this case, it should be "ZLIB" followed
10809 by the uncompressed section size, 8 bytes in big-endian order. */
10810 if (compressed_size < header_size
10811 || ! streq ((char *) compressed_buffer, "ZLIB"))
10812 return 0;
10813
10814 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10815 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10816 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10817 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10818 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10819 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10820 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10821 uncompressed_size += compressed_buffer[11];
10822
10823 /* It is possible the section consists of several compressed
10824 buffers concatenated together, so we uncompress in a loop. */
10825 strm.zalloc = NULL;
10826 strm.zfree = NULL;
10827 strm.opaque = NULL;
10828 strm.avail_in = compressed_size - header_size;
10829 strm.next_in = (Bytef *) compressed_buffer + header_size;
10830 strm.avail_out = uncompressed_size;
10831 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10832
10833 rc = inflateInit (& strm);
10834 while (strm.avail_in > 0)
10835 {
10836 if (rc != Z_OK)
10837 goto fail;
10838 strm.next_out = ((Bytef *) uncompressed_buffer
10839 + (uncompressed_size - strm.avail_out));
10840 rc = inflate (&strm, Z_FINISH);
10841 if (rc != Z_STREAM_END)
10842 goto fail;
10843 rc = inflateReset (& strm);
10844 }
10845 rc = inflateEnd (& strm);
10846 if (rc != Z_OK
10847 || strm.avail_out != 0)
10848 goto fail;
10849
10850 free (compressed_buffer);
10851 *buffer = uncompressed_buffer;
10852 *size = uncompressed_size;
10853 return 1;
10854
10855 fail:
10856 free (uncompressed_buffer);
10857 /* Indicate decompression failure. */
10858 *buffer = NULL;
10859 return 0;
10860 #endif /* HAVE_ZLIB_H */
10861 }
10862
10863 static int
10864 load_specific_debug_section (enum dwarf_section_display_enum debug,
10865 Elf_Internal_Shdr * sec, void * file)
10866 {
10867 struct dwarf_section * section = &debug_displays [debug].section;
10868 char buf [64];
10869
10870 /* If it is already loaded, do nothing. */
10871 if (section->start != NULL)
10872 return 1;
10873
10874 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10875 section->address = sec->sh_addr;
10876 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10877 sec->sh_offset, 1,
10878 sec->sh_size, buf);
10879 if (section->start == NULL)
10880 section->size = 0;
10881 else
10882 {
10883 section->size = sec->sh_size;
10884 if (uncompress_section_contents (&section->start, &section->size))
10885 sec->sh_size = section->size;
10886 }
10887
10888 if (section->start == NULL)
10889 return 0;
10890
10891 if (debug_displays [debug].relocate)
10892 apply_relocations ((FILE *) file, sec, section->start);
10893
10894 return 1;
10895 }
10896
10897 /* If this is not NULL, load_debug_section will only look for sections
10898 within the list of sections given here. */
10899 unsigned int *section_subset = NULL;
10900
10901 int
10902 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10903 {
10904 struct dwarf_section * section = &debug_displays [debug].section;
10905 Elf_Internal_Shdr * sec;
10906
10907 /* Locate the debug section. */
10908 sec = find_section_in_set (section->uncompressed_name, section_subset);
10909 if (sec != NULL)
10910 section->name = section->uncompressed_name;
10911 else
10912 {
10913 sec = find_section_in_set (section->compressed_name, section_subset);
10914 if (sec != NULL)
10915 section->name = section->compressed_name;
10916 }
10917 if (sec == NULL)
10918 return 0;
10919
10920 /* If we're loading from a subset of sections, and we've loaded
10921 a section matching this name before, it's likely that it's a
10922 different one. */
10923 if (section_subset != NULL)
10924 free_debug_section (debug);
10925
10926 return load_specific_debug_section (debug, sec, (FILE *) file);
10927 }
10928
10929 void
10930 free_debug_section (enum dwarf_section_display_enum debug)
10931 {
10932 struct dwarf_section * section = &debug_displays [debug].section;
10933
10934 if (section->start == NULL)
10935 return;
10936
10937 free ((char *) section->start);
10938 section->start = NULL;
10939 section->address = 0;
10940 section->size = 0;
10941 }
10942
10943 static int
10944 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
10945 {
10946 char * name = SECTION_NAME (section);
10947 bfd_size_type length;
10948 int result = 1;
10949 int i;
10950
10951 length = section->sh_size;
10952 if (length == 0)
10953 {
10954 printf (_("\nSection '%s' has no debugging data.\n"), name);
10955 return 0;
10956 }
10957 if (section->sh_type == SHT_NOBITS)
10958 {
10959 /* There is no point in dumping the contents of a debugging section
10960 which has the NOBITS type - the bits in the file will be random.
10961 This can happen when a file containing a .eh_frame section is
10962 stripped with the --only-keep-debug command line option. */
10963 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10964 return 0;
10965 }
10966
10967 if (const_strneq (name, ".gnu.linkonce.wi."))
10968 name = ".debug_info";
10969
10970 /* See if we know how to display the contents of this section. */
10971 for (i = 0; i < max; i++)
10972 if (streq (debug_displays[i].section.uncompressed_name, name)
10973 || streq (debug_displays[i].section.compressed_name, name))
10974 {
10975 struct dwarf_section * sec = &debug_displays [i].section;
10976 int secondary = (section != find_section (name));
10977
10978 if (secondary)
10979 free_debug_section ((enum dwarf_section_display_enum) i);
10980
10981 if (streq (sec->uncompressed_name, name))
10982 sec->name = sec->uncompressed_name;
10983 else
10984 sec->name = sec->compressed_name;
10985 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10986 section, file))
10987 {
10988 /* If this debug section is part of a CU/TU set in a .dwp file,
10989 restrict load_debug_section to the sections in that set. */
10990 section_subset = find_cu_tu_set (file, shndx);
10991
10992 result &= debug_displays[i].display (sec, file);
10993
10994 section_subset = NULL;
10995
10996 if (secondary || (i != info && i != abbrev))
10997 free_debug_section ((enum dwarf_section_display_enum) i);
10998 }
10999
11000 break;
11001 }
11002
11003 if (i == max)
11004 {
11005 printf (_("Unrecognized debug section: %s\n"), name);
11006 result = 0;
11007 }
11008
11009 return result;
11010 }
11011
11012 /* Set DUMP_SECTS for all sections where dumps were requested
11013 based on section name. */
11014
11015 static void
11016 initialise_dumps_byname (void)
11017 {
11018 struct dump_list_entry * cur;
11019
11020 for (cur = dump_sects_byname; cur; cur = cur->next)
11021 {
11022 unsigned int i;
11023 int any;
11024
11025 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11026 if (streq (SECTION_NAME (section_headers + i), cur->name))
11027 {
11028 request_dump_bynumber (i, cur->type);
11029 any = 1;
11030 }
11031
11032 if (!any)
11033 warn (_("Section '%s' was not dumped because it does not exist!\n"),
11034 cur->name);
11035 }
11036 }
11037
11038 static void
11039 process_section_contents (FILE * file)
11040 {
11041 Elf_Internal_Shdr * section;
11042 unsigned int i;
11043
11044 if (! do_dump)
11045 return;
11046
11047 initialise_dumps_byname ();
11048
11049 for (i = 0, section = section_headers;
11050 i < elf_header.e_shnum && i < num_dump_sects;
11051 i++, section++)
11052 {
11053 #ifdef SUPPORT_DISASSEMBLY
11054 if (dump_sects[i] & DISASS_DUMP)
11055 disassemble_section (section, file);
11056 #endif
11057 if (dump_sects[i] & HEX_DUMP)
11058 dump_section_as_bytes (section, file, FALSE);
11059
11060 if (dump_sects[i] & RELOC_DUMP)
11061 dump_section_as_bytes (section, file, TRUE);
11062
11063 if (dump_sects[i] & STRING_DUMP)
11064 dump_section_as_strings (section, file);
11065
11066 if (dump_sects[i] & DEBUG_DUMP)
11067 display_debug_section (i, section, file);
11068 }
11069
11070 /* Check to see if the user requested a
11071 dump of a section that does not exist. */
11072 while (i++ < num_dump_sects)
11073 if (dump_sects[i])
11074 warn (_("Section %d was not dumped because it does not exist!\n"), i);
11075 }
11076
11077 static void
11078 process_mips_fpe_exception (int mask)
11079 {
11080 if (mask)
11081 {
11082 int first = 1;
11083 if (mask & OEX_FPU_INEX)
11084 fputs ("INEX", stdout), first = 0;
11085 if (mask & OEX_FPU_UFLO)
11086 printf ("%sUFLO", first ? "" : "|"), first = 0;
11087 if (mask & OEX_FPU_OFLO)
11088 printf ("%sOFLO", first ? "" : "|"), first = 0;
11089 if (mask & OEX_FPU_DIV0)
11090 printf ("%sDIV0", first ? "" : "|"), first = 0;
11091 if (mask & OEX_FPU_INVAL)
11092 printf ("%sINVAL", first ? "" : "|");
11093 }
11094 else
11095 fputs ("0", stdout);
11096 }
11097
11098 /* ARM EABI attributes section. */
11099 typedef struct
11100 {
11101 int tag;
11102 const char * name;
11103 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
11104 int type;
11105 const char ** table;
11106 } arm_attr_public_tag;
11107
11108 static const char * arm_attr_tag_CPU_arch[] =
11109 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11110 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11111 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11112 static const char * arm_attr_tag_THUMB_ISA_use[] =
11113 {"No", "Thumb-1", "Thumb-2"};
11114 static const char * arm_attr_tag_FP_arch[] =
11115 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11116 "FP for ARMv8"};
11117 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11118 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11119 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11120 static const char * arm_attr_tag_PCS_config[] =
11121 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11122 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11123 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11124 {"V6", "SB", "TLS", "Unused"};
11125 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11126 {"Absolute", "PC-relative", "SB-relative", "None"};
11127 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11128 {"Absolute", "PC-relative", "None"};
11129 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11130 {"None", "direct", "GOT-indirect"};
11131 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11132 {"None", "??? 1", "2", "??? 3", "4"};
11133 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11134 static const char * arm_attr_tag_ABI_FP_denormal[] =
11135 {"Unused", "Needed", "Sign only"};
11136 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11137 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11138 static const char * arm_attr_tag_ABI_FP_number_model[] =
11139 {"Unused", "Finite", "RTABI", "IEEE 754"};
11140 static const char * arm_attr_tag_ABI_enum_size[] =
11141 {"Unused", "small", "int", "forced to int"};
11142 static const char * arm_attr_tag_ABI_HardFP_use[] =
11143 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11144 static const char * arm_attr_tag_ABI_VFP_args[] =
11145 {"AAPCS", "VFP registers", "custom"};
11146 static const char * arm_attr_tag_ABI_WMMX_args[] =
11147 {"AAPCS", "WMMX registers", "custom"};
11148 static const char * arm_attr_tag_ABI_optimization_goals[] =
11149 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11150 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11151 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11152 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11153 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11154 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11155 static const char * arm_attr_tag_FP_HP_extension[] =
11156 {"Not Allowed", "Allowed"};
11157 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11158 {"None", "IEEE 754", "Alternative Format"};
11159 static const char * arm_attr_tag_MPextension_use[] =
11160 {"Not Allowed", "Allowed"};
11161 static const char * arm_attr_tag_DIV_use[] =
11162 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11163 "Allowed in v7-A with integer division extension"};
11164 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11165 static const char * arm_attr_tag_Virtualization_use[] =
11166 {"Not Allowed", "TrustZone", "Virtualization Extensions",
11167 "TrustZone and Virtualization Extensions"};
11168 static const char * arm_attr_tag_MPextension_use_legacy[] =
11169 {"Not Allowed", "Allowed"};
11170
11171 #define LOOKUP(id, name) \
11172 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11173 static arm_attr_public_tag arm_attr_public_tags[] =
11174 {
11175 {4, "CPU_raw_name", 1, NULL},
11176 {5, "CPU_name", 1, NULL},
11177 LOOKUP(6, CPU_arch),
11178 {7, "CPU_arch_profile", 0, NULL},
11179 LOOKUP(8, ARM_ISA_use),
11180 LOOKUP(9, THUMB_ISA_use),
11181 LOOKUP(10, FP_arch),
11182 LOOKUP(11, WMMX_arch),
11183 LOOKUP(12, Advanced_SIMD_arch),
11184 LOOKUP(13, PCS_config),
11185 LOOKUP(14, ABI_PCS_R9_use),
11186 LOOKUP(15, ABI_PCS_RW_data),
11187 LOOKUP(16, ABI_PCS_RO_data),
11188 LOOKUP(17, ABI_PCS_GOT_use),
11189 LOOKUP(18, ABI_PCS_wchar_t),
11190 LOOKUP(19, ABI_FP_rounding),
11191 LOOKUP(20, ABI_FP_denormal),
11192 LOOKUP(21, ABI_FP_exceptions),
11193 LOOKUP(22, ABI_FP_user_exceptions),
11194 LOOKUP(23, ABI_FP_number_model),
11195 {24, "ABI_align_needed", 0, NULL},
11196 {25, "ABI_align_preserved", 0, NULL},
11197 LOOKUP(26, ABI_enum_size),
11198 LOOKUP(27, ABI_HardFP_use),
11199 LOOKUP(28, ABI_VFP_args),
11200 LOOKUP(29, ABI_WMMX_args),
11201 LOOKUP(30, ABI_optimization_goals),
11202 LOOKUP(31, ABI_FP_optimization_goals),
11203 {32, "compatibility", 0, NULL},
11204 LOOKUP(34, CPU_unaligned_access),
11205 LOOKUP(36, FP_HP_extension),
11206 LOOKUP(38, ABI_FP_16bit_format),
11207 LOOKUP(42, MPextension_use),
11208 LOOKUP(44, DIV_use),
11209 {64, "nodefaults", 0, NULL},
11210 {65, "also_compatible_with", 0, NULL},
11211 LOOKUP(66, T2EE_use),
11212 {67, "conformance", 1, NULL},
11213 LOOKUP(68, Virtualization_use),
11214 LOOKUP(70, MPextension_use_legacy)
11215 };
11216 #undef LOOKUP
11217
11218 static unsigned char *
11219 display_arm_attribute (unsigned char * p)
11220 {
11221 int tag;
11222 unsigned int len;
11223 int val;
11224 arm_attr_public_tag * attr;
11225 unsigned i;
11226 int type;
11227
11228 tag = read_uleb128 (p, &len);
11229 p += len;
11230 attr = NULL;
11231 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11232 {
11233 if (arm_attr_public_tags[i].tag == tag)
11234 {
11235 attr = &arm_attr_public_tags[i];
11236 break;
11237 }
11238 }
11239
11240 if (attr)
11241 {
11242 printf (" Tag_%s: ", attr->name);
11243 switch (attr->type)
11244 {
11245 case 0:
11246 switch (tag)
11247 {
11248 case 7: /* Tag_CPU_arch_profile. */
11249 val = read_uleb128 (p, &len);
11250 p += len;
11251 switch (val)
11252 {
11253 case 0: printf (_("None\n")); break;
11254 case 'A': printf (_("Application\n")); break;
11255 case 'R': printf (_("Realtime\n")); break;
11256 case 'M': printf (_("Microcontroller\n")); break;
11257 case 'S': printf (_("Application or Realtime\n")); break;
11258 default: printf ("??? (%d)\n", val); break;
11259 }
11260 break;
11261
11262 case 24: /* Tag_align_needed. */
11263 val = read_uleb128 (p, &len);
11264 p += len;
11265 switch (val)
11266 {
11267 case 0: printf (_("None\n")); break;
11268 case 1: printf (_("8-byte\n")); break;
11269 case 2: printf (_("4-byte\n")); break;
11270 case 3: printf ("??? 3\n"); break;
11271 default:
11272 if (val <= 12)
11273 printf (_("8-byte and up to %d-byte extended\n"),
11274 1 << val);
11275 else
11276 printf ("??? (%d)\n", val);
11277 break;
11278 }
11279 break;
11280
11281 case 25: /* Tag_align_preserved. */
11282 val = read_uleb128 (p, &len);
11283 p += len;
11284 switch (val)
11285 {
11286 case 0: printf (_("None\n")); break;
11287 case 1: printf (_("8-byte, except leaf SP\n")); break;
11288 case 2: printf (_("8-byte\n")); break;
11289 case 3: printf ("??? 3\n"); break;
11290 default:
11291 if (val <= 12)
11292 printf (_("8-byte and up to %d-byte extended\n"),
11293 1 << val);
11294 else
11295 printf ("??? (%d)\n", val);
11296 break;
11297 }
11298 break;
11299
11300 case 32: /* Tag_compatibility. */
11301 val = read_uleb128 (p, &len);
11302 p += len;
11303 printf (_("flag = %d, vendor = %s\n"), val, p);
11304 p += strlen ((char *) p) + 1;
11305 break;
11306
11307 case 64: /* Tag_nodefaults. */
11308 p++;
11309 printf (_("True\n"));
11310 break;
11311
11312 case 65: /* Tag_also_compatible_with. */
11313 val = read_uleb128 (p, &len);
11314 p += len;
11315 if (val == 6 /* Tag_CPU_arch. */)
11316 {
11317 val = read_uleb128 (p, &len);
11318 p += len;
11319 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11320 printf ("??? (%d)\n", val);
11321 else
11322 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11323 }
11324 else
11325 printf ("???\n");
11326 while (*(p++) != '\0' /* NUL terminator. */);
11327 break;
11328
11329 default:
11330 abort ();
11331 }
11332 return p;
11333
11334 case 1:
11335 case 2:
11336 type = attr->type;
11337 break;
11338
11339 default:
11340 assert (attr->type & 0x80);
11341 val = read_uleb128 (p, &len);
11342 p += len;
11343 type = attr->type & 0x7f;
11344 if (val >= type)
11345 printf ("??? (%d)\n", val);
11346 else
11347 printf ("%s\n", attr->table[val]);
11348 return p;
11349 }
11350 }
11351 else
11352 {
11353 if (tag & 1)
11354 type = 1; /* String. */
11355 else
11356 type = 2; /* uleb128. */
11357 printf (" Tag_unknown_%d: ", tag);
11358 }
11359
11360 if (type == 1)
11361 {
11362 printf ("\"%s\"\n", p);
11363 p += strlen ((char *) p) + 1;
11364 }
11365 else
11366 {
11367 val = read_uleb128 (p, &len);
11368 p += len;
11369 printf ("%d (0x%x)\n", val, val);
11370 }
11371
11372 return p;
11373 }
11374
11375 static unsigned char *
11376 display_gnu_attribute (unsigned char * p,
11377 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11378 {
11379 int tag;
11380 unsigned int len;
11381 int val;
11382 int type;
11383
11384 tag = read_uleb128 (p, &len);
11385 p += len;
11386
11387 /* Tag_compatibility is the only generic GNU attribute defined at
11388 present. */
11389 if (tag == 32)
11390 {
11391 val = read_uleb128 (p, &len);
11392 p += len;
11393 printf (_("flag = %d, vendor = %s\n"), val, p);
11394 p += strlen ((char *) p) + 1;
11395 return p;
11396 }
11397
11398 if ((tag & 2) == 0 && display_proc_gnu_attribute)
11399 return display_proc_gnu_attribute (p, tag);
11400
11401 if (tag & 1)
11402 type = 1; /* String. */
11403 else
11404 type = 2; /* uleb128. */
11405 printf (" Tag_unknown_%d: ", tag);
11406
11407 if (type == 1)
11408 {
11409 printf ("\"%s\"\n", p);
11410 p += strlen ((char *) p) + 1;
11411 }
11412 else
11413 {
11414 val = read_uleb128 (p, &len);
11415 p += len;
11416 printf ("%d (0x%x)\n", val, val);
11417 }
11418
11419 return p;
11420 }
11421
11422 static unsigned char *
11423 display_power_gnu_attribute (unsigned char * p, int tag)
11424 {
11425 int type;
11426 unsigned int len;
11427 int val;
11428
11429 if (tag == Tag_GNU_Power_ABI_FP)
11430 {
11431 val = read_uleb128 (p, &len);
11432 p += len;
11433 printf (" Tag_GNU_Power_ABI_FP: ");
11434
11435 switch (val)
11436 {
11437 case 0:
11438 printf (_("Hard or soft float\n"));
11439 break;
11440 case 1:
11441 printf (_("Hard float\n"));
11442 break;
11443 case 2:
11444 printf (_("Soft float\n"));
11445 break;
11446 case 3:
11447 printf (_("Single-precision hard float\n"));
11448 break;
11449 default:
11450 printf ("??? (%d)\n", val);
11451 break;
11452 }
11453 return p;
11454 }
11455
11456 if (tag == Tag_GNU_Power_ABI_Vector)
11457 {
11458 val = read_uleb128 (p, &len);
11459 p += len;
11460 printf (" Tag_GNU_Power_ABI_Vector: ");
11461 switch (val)
11462 {
11463 case 0:
11464 printf (_("Any\n"));
11465 break;
11466 case 1:
11467 printf (_("Generic\n"));
11468 break;
11469 case 2:
11470 printf ("AltiVec\n");
11471 break;
11472 case 3:
11473 printf ("SPE\n");
11474 break;
11475 default:
11476 printf ("??? (%d)\n", val);
11477 break;
11478 }
11479 return p;
11480 }
11481
11482 if (tag == Tag_GNU_Power_ABI_Struct_Return)
11483 {
11484 val = read_uleb128 (p, &len);
11485 p += len;
11486 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
11487 switch (val)
11488 {
11489 case 0:
11490 printf (_("Any\n"));
11491 break;
11492 case 1:
11493 printf ("r3/r4\n");
11494 break;
11495 case 2:
11496 printf (_("Memory\n"));
11497 break;
11498 default:
11499 printf ("??? (%d)\n", val);
11500 break;
11501 }
11502 return p;
11503 }
11504
11505 if (tag & 1)
11506 type = 1; /* String. */
11507 else
11508 type = 2; /* uleb128. */
11509 printf (" Tag_unknown_%d: ", tag);
11510
11511 if (type == 1)
11512 {
11513 printf ("\"%s\"\n", p);
11514 p += strlen ((char *) p) + 1;
11515 }
11516 else
11517 {
11518 val = read_uleb128 (p, &len);
11519 p += len;
11520 printf ("%d (0x%x)\n", val, val);
11521 }
11522
11523 return p;
11524 }
11525
11526 static void
11527 display_sparc_hwcaps (int mask)
11528 {
11529 if (mask)
11530 {
11531 int first = 1;
11532 if (mask & ELF_SPARC_HWCAP_MUL32)
11533 fputs ("mul32", stdout), first = 0;
11534 if (mask & ELF_SPARC_HWCAP_DIV32)
11535 printf ("%sdiv32", first ? "" : "|"), first = 0;
11536 if (mask & ELF_SPARC_HWCAP_FSMULD)
11537 printf ("%sfsmuld", first ? "" : "|"), first = 0;
11538 if (mask & ELF_SPARC_HWCAP_V8PLUS)
11539 printf ("%sv8plus", first ? "" : "|"), first = 0;
11540 if (mask & ELF_SPARC_HWCAP_POPC)
11541 printf ("%spopc", first ? "" : "|"), first = 0;
11542 if (mask & ELF_SPARC_HWCAP_VIS)
11543 printf ("%svis", first ? "" : "|"), first = 0;
11544 if (mask & ELF_SPARC_HWCAP_VIS2)
11545 printf ("%svis2", first ? "" : "|"), first = 0;
11546 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11547 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11548 if (mask & ELF_SPARC_HWCAP_FMAF)
11549 printf ("%sfmaf", first ? "" : "|"), first = 0;
11550 if (mask & ELF_SPARC_HWCAP_VIS3)
11551 printf ("%svis3", first ? "" : "|"), first = 0;
11552 if (mask & ELF_SPARC_HWCAP_HPC)
11553 printf ("%shpc", first ? "" : "|"), first = 0;
11554 if (mask & ELF_SPARC_HWCAP_RANDOM)
11555 printf ("%srandom", first ? "" : "|"), first = 0;
11556 if (mask & ELF_SPARC_HWCAP_TRANS)
11557 printf ("%strans", first ? "" : "|"), first = 0;
11558 if (mask & ELF_SPARC_HWCAP_FJFMAU)
11559 printf ("%sfjfmau", first ? "" : "|"), first = 0;
11560 if (mask & ELF_SPARC_HWCAP_IMA)
11561 printf ("%sima", first ? "" : "|"), first = 0;
11562 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11563 printf ("%scspare", first ? "" : "|"), first = 0;
11564 }
11565 else
11566 fputc('0', stdout);
11567 fputc('\n', stdout);
11568 }
11569
11570 static unsigned char *
11571 display_sparc_gnu_attribute (unsigned char * p, int tag)
11572 {
11573 int type;
11574 unsigned int len;
11575 int val;
11576
11577 if (tag == Tag_GNU_Sparc_HWCAPS)
11578 {
11579 val = read_uleb128 (p, &len);
11580 p += len;
11581 printf (" Tag_GNU_Sparc_HWCAPS: ");
11582
11583 display_sparc_hwcaps (val);
11584 return p;
11585 }
11586
11587 if (tag & 1)
11588 type = 1; /* String. */
11589 else
11590 type = 2; /* uleb128. */
11591 printf (" Tag_unknown_%d: ", tag);
11592
11593 if (type == 1)
11594 {
11595 printf ("\"%s\"\n", p);
11596 p += strlen ((char *) p) + 1;
11597 }
11598 else
11599 {
11600 val = read_uleb128 (p, &len);
11601 p += len;
11602 printf ("%d (0x%x)\n", val, val);
11603 }
11604
11605 return p;
11606 }
11607
11608 static unsigned char *
11609 display_mips_gnu_attribute (unsigned char * p, int tag)
11610 {
11611 int type;
11612 unsigned int len;
11613 int val;
11614
11615 if (tag == Tag_GNU_MIPS_ABI_FP)
11616 {
11617 val = read_uleb128 (p, &len);
11618 p += len;
11619 printf (" Tag_GNU_MIPS_ABI_FP: ");
11620
11621 switch (val)
11622 {
11623 case 0:
11624 printf (_("Hard or soft float\n"));
11625 break;
11626 case 1:
11627 printf (_("Hard float (double precision)\n"));
11628 break;
11629 case 2:
11630 printf (_("Hard float (single precision)\n"));
11631 break;
11632 case 3:
11633 printf (_("Soft float\n"));
11634 break;
11635 case 4:
11636 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11637 break;
11638 default:
11639 printf ("??? (%d)\n", val);
11640 break;
11641 }
11642 return p;
11643 }
11644
11645 if (tag & 1)
11646 type = 1; /* String. */
11647 else
11648 type = 2; /* uleb128. */
11649 printf (" Tag_unknown_%d: ", tag);
11650
11651 if (type == 1)
11652 {
11653 printf ("\"%s\"\n", p);
11654 p += strlen ((char *) p) + 1;
11655 }
11656 else
11657 {
11658 val = read_uleb128 (p, &len);
11659 p += len;
11660 printf ("%d (0x%x)\n", val, val);
11661 }
11662
11663 return p;
11664 }
11665
11666 static unsigned char *
11667 display_tic6x_attribute (unsigned char * p)
11668 {
11669 int tag;
11670 unsigned int len;
11671 int val;
11672
11673 tag = read_uleb128 (p, &len);
11674 p += len;
11675
11676 switch (tag)
11677 {
11678 case Tag_ISA:
11679 val = read_uleb128 (p, &len);
11680 p += len;
11681 printf (" Tag_ISA: ");
11682
11683 switch (val)
11684 {
11685 case C6XABI_Tag_ISA_none:
11686 printf (_("None\n"));
11687 break;
11688 case C6XABI_Tag_ISA_C62X:
11689 printf ("C62x\n");
11690 break;
11691 case C6XABI_Tag_ISA_C67X:
11692 printf ("C67x\n");
11693 break;
11694 case C6XABI_Tag_ISA_C67XP:
11695 printf ("C67x+\n");
11696 break;
11697 case C6XABI_Tag_ISA_C64X:
11698 printf ("C64x\n");
11699 break;
11700 case C6XABI_Tag_ISA_C64XP:
11701 printf ("C64x+\n");
11702 break;
11703 case C6XABI_Tag_ISA_C674X:
11704 printf ("C674x\n");
11705 break;
11706 default:
11707 printf ("??? (%d)\n", val);
11708 break;
11709 }
11710 return p;
11711
11712 case Tag_ABI_wchar_t:
11713 val = read_uleb128 (p, &len);
11714 p += len;
11715 printf (" Tag_ABI_wchar_t: ");
11716 switch (val)
11717 {
11718 case 0:
11719 printf (_("Not used\n"));
11720 break;
11721 case 1:
11722 printf (_("2 bytes\n"));
11723 break;
11724 case 2:
11725 printf (_("4 bytes\n"));
11726 break;
11727 default:
11728 printf ("??? (%d)\n", val);
11729 break;
11730 }
11731 return p;
11732
11733 case Tag_ABI_stack_align_needed:
11734 val = read_uleb128 (p, &len);
11735 p += len;
11736 printf (" Tag_ABI_stack_align_needed: ");
11737 switch (val)
11738 {
11739 case 0:
11740 printf (_("8-byte\n"));
11741 break;
11742 case 1:
11743 printf (_("16-byte\n"));
11744 break;
11745 default:
11746 printf ("??? (%d)\n", val);
11747 break;
11748 }
11749 return p;
11750
11751 case Tag_ABI_stack_align_preserved:
11752 val = read_uleb128 (p, &len);
11753 p += len;
11754 printf (" Tag_ABI_stack_align_preserved: ");
11755 switch (val)
11756 {
11757 case 0:
11758 printf (_("8-byte\n"));
11759 break;
11760 case 1:
11761 printf (_("16-byte\n"));
11762 break;
11763 default:
11764 printf ("??? (%d)\n", val);
11765 break;
11766 }
11767 return p;
11768
11769 case Tag_ABI_DSBT:
11770 val = read_uleb128 (p, &len);
11771 p += len;
11772 printf (" Tag_ABI_DSBT: ");
11773 switch (val)
11774 {
11775 case 0:
11776 printf (_("DSBT addressing not used\n"));
11777 break;
11778 case 1:
11779 printf (_("DSBT addressing used\n"));
11780 break;
11781 default:
11782 printf ("??? (%d)\n", val);
11783 break;
11784 }
11785 return p;
11786
11787 case Tag_ABI_PID:
11788 val = read_uleb128 (p, &len);
11789 p += len;
11790 printf (" Tag_ABI_PID: ");
11791 switch (val)
11792 {
11793 case 0:
11794 printf (_("Data addressing position-dependent\n"));
11795 break;
11796 case 1:
11797 printf (_("Data addressing position-independent, GOT near DP\n"));
11798 break;
11799 case 2:
11800 printf (_("Data addressing position-independent, GOT far from DP\n"));
11801 break;
11802 default:
11803 printf ("??? (%d)\n", val);
11804 break;
11805 }
11806 return p;
11807
11808 case Tag_ABI_PIC:
11809 val = read_uleb128 (p, &len);
11810 p += len;
11811 printf (" Tag_ABI_PIC: ");
11812 switch (val)
11813 {
11814 case 0:
11815 printf (_("Code addressing position-dependent\n"));
11816 break;
11817 case 1:
11818 printf (_("Code addressing position-independent\n"));
11819 break;
11820 default:
11821 printf ("??? (%d)\n", val);
11822 break;
11823 }
11824 return p;
11825
11826 case Tag_ABI_array_object_alignment:
11827 val = read_uleb128 (p, &len);
11828 p += len;
11829 printf (" Tag_ABI_array_object_alignment: ");
11830 switch (val)
11831 {
11832 case 0:
11833 printf (_("8-byte\n"));
11834 break;
11835 case 1:
11836 printf (_("4-byte\n"));
11837 break;
11838 case 2:
11839 printf (_("16-byte\n"));
11840 break;
11841 default:
11842 printf ("??? (%d)\n", val);
11843 break;
11844 }
11845 return p;
11846
11847 case Tag_ABI_array_object_align_expected:
11848 val = read_uleb128 (p, &len);
11849 p += len;
11850 printf (" Tag_ABI_array_object_align_expected: ");
11851 switch (val)
11852 {
11853 case 0:
11854 printf (_("8-byte\n"));
11855 break;
11856 case 1:
11857 printf (_("4-byte\n"));
11858 break;
11859 case 2:
11860 printf (_("16-byte\n"));
11861 break;
11862 default:
11863 printf ("??? (%d)\n", val);
11864 break;
11865 }
11866 return p;
11867
11868 case Tag_ABI_compatibility:
11869 val = read_uleb128 (p, &len);
11870 p += len;
11871 printf (" Tag_ABI_compatibility: ");
11872 printf (_("flag = %d, vendor = %s\n"), val, p);
11873 p += strlen ((char *) p) + 1;
11874 return p;
11875
11876 case Tag_ABI_conformance:
11877 printf (" Tag_ABI_conformance: ");
11878 printf ("\"%s\"\n", p);
11879 p += strlen ((char *) p) + 1;
11880 return p;
11881 }
11882
11883 printf (" Tag_unknown_%d: ", tag);
11884
11885 if (tag & 1)
11886 {
11887 printf ("\"%s\"\n", p);
11888 p += strlen ((char *) p) + 1;
11889 }
11890 else
11891 {
11892 val = read_uleb128 (p, &len);
11893 p += len;
11894 printf ("%d (0x%x)\n", val, val);
11895 }
11896
11897 return p;
11898 }
11899
11900 static int
11901 process_attributes (FILE * file,
11902 const char * public_name,
11903 unsigned int proc_type,
11904 unsigned char * (* display_pub_attribute) (unsigned char *),
11905 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11906 {
11907 Elf_Internal_Shdr * sect;
11908 unsigned char * contents;
11909 unsigned char * p;
11910 unsigned char * end;
11911 bfd_vma section_len;
11912 bfd_vma len;
11913 unsigned i;
11914
11915 /* Find the section header so that we get the size. */
11916 for (i = 0, sect = section_headers;
11917 i < elf_header.e_shnum;
11918 i++, sect++)
11919 {
11920 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11921 continue;
11922
11923 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11924 sect->sh_size, _("attributes"));
11925 if (contents == NULL)
11926 continue;
11927
11928 p = contents;
11929 if (*p == 'A')
11930 {
11931 len = sect->sh_size - 1;
11932 p++;
11933
11934 while (len > 0)
11935 {
11936 int namelen;
11937 bfd_boolean public_section;
11938 bfd_boolean gnu_section;
11939
11940 section_len = byte_get (p, 4);
11941 p += 4;
11942
11943 if (section_len > len)
11944 {
11945 printf (_("ERROR: Bad section length (%d > %d)\n"),
11946 (int) section_len, (int) len);
11947 section_len = len;
11948 }
11949
11950 len -= section_len;
11951 printf (_("Attribute Section: %s\n"), p);
11952
11953 if (public_name && streq ((char *) p, public_name))
11954 public_section = TRUE;
11955 else
11956 public_section = FALSE;
11957
11958 if (streq ((char *) p, "gnu"))
11959 gnu_section = TRUE;
11960 else
11961 gnu_section = FALSE;
11962
11963 namelen = strlen ((char *) p) + 1;
11964 p += namelen;
11965 section_len -= namelen + 4;
11966
11967 while (section_len > 0)
11968 {
11969 int tag = *(p++);
11970 int val;
11971 bfd_vma size;
11972
11973 size = byte_get (p, 4);
11974 if (size > section_len)
11975 {
11976 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11977 (int) size, (int) section_len);
11978 size = section_len;
11979 }
11980
11981 section_len -= size;
11982 end = p + size - 1;
11983 p += 4;
11984
11985 switch (tag)
11986 {
11987 case 1:
11988 printf (_("File Attributes\n"));
11989 break;
11990 case 2:
11991 printf (_("Section Attributes:"));
11992 goto do_numlist;
11993 case 3:
11994 printf (_("Symbol Attributes:"));
11995 do_numlist:
11996 for (;;)
11997 {
11998 unsigned int j;
11999
12000 val = read_uleb128 (p, &j);
12001 p += j;
12002 if (val == 0)
12003 break;
12004 printf (" %d", val);
12005 }
12006 printf ("\n");
12007 break;
12008 default:
12009 printf (_("Unknown tag: %d\n"), tag);
12010 public_section = FALSE;
12011 break;
12012 }
12013
12014 if (public_section)
12015 {
12016 while (p < end)
12017 p = display_pub_attribute (p);
12018 }
12019 else if (gnu_section)
12020 {
12021 while (p < end)
12022 p = display_gnu_attribute (p,
12023 display_proc_gnu_attribute);
12024 }
12025 else
12026 {
12027 /* ??? Do something sensible, like dump hex. */
12028 printf (_(" Unknown section contexts\n"));
12029 p = end;
12030 }
12031 }
12032 }
12033 }
12034 else
12035 printf (_("Unknown format '%c'\n"), *p);
12036
12037 free (contents);
12038 }
12039 return 1;
12040 }
12041
12042 static int
12043 process_arm_specific (FILE * file)
12044 {
12045 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12046 display_arm_attribute, NULL);
12047 }
12048
12049 static int
12050 process_power_specific (FILE * file)
12051 {
12052 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12053 display_power_gnu_attribute);
12054 }
12055
12056 static int
12057 process_sparc_specific (FILE * file)
12058 {
12059 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12060 display_sparc_gnu_attribute);
12061 }
12062
12063 static int
12064 process_tic6x_specific (FILE * file)
12065 {
12066 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12067 display_tic6x_attribute, NULL);
12068 }
12069
12070 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12071 Print the Address, Access and Initial fields of an entry at VMA ADDR
12072 and return the VMA of the next entry. */
12073
12074 static bfd_vma
12075 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12076 {
12077 printf (" ");
12078 print_vma (addr, LONG_HEX);
12079 printf (" ");
12080 if (addr < pltgot + 0xfff0)
12081 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12082 else
12083 printf ("%10s", "");
12084 printf (" ");
12085 if (data == NULL)
12086 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12087 else
12088 {
12089 bfd_vma entry;
12090
12091 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12092 print_vma (entry, LONG_HEX);
12093 }
12094 return addr + (is_32bit_elf ? 4 : 8);
12095 }
12096
12097 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12098 PLTGOT. Print the Address and Initial fields of an entry at VMA
12099 ADDR and return the VMA of the next entry. */
12100
12101 static bfd_vma
12102 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12103 {
12104 printf (" ");
12105 print_vma (addr, LONG_HEX);
12106 printf (" ");
12107 if (data == NULL)
12108 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12109 else
12110 {
12111 bfd_vma entry;
12112
12113 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12114 print_vma (entry, LONG_HEX);
12115 }
12116 return addr + (is_32bit_elf ? 4 : 8);
12117 }
12118
12119 static int
12120 process_mips_specific (FILE * file)
12121 {
12122 Elf_Internal_Dyn * entry;
12123 size_t liblist_offset = 0;
12124 size_t liblistno = 0;
12125 size_t conflictsno = 0;
12126 size_t options_offset = 0;
12127 size_t conflicts_offset = 0;
12128 size_t pltrelsz = 0;
12129 size_t pltrel = 0;
12130 bfd_vma pltgot = 0;
12131 bfd_vma mips_pltgot = 0;
12132 bfd_vma jmprel = 0;
12133 bfd_vma local_gotno = 0;
12134 bfd_vma gotsym = 0;
12135 bfd_vma symtabno = 0;
12136
12137 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12138 display_mips_gnu_attribute);
12139
12140 /* We have a lot of special sections. Thanks SGI! */
12141 if (dynamic_section == NULL)
12142 /* No information available. */
12143 return 0;
12144
12145 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
12146 switch (entry->d_tag)
12147 {
12148 case DT_MIPS_LIBLIST:
12149 liblist_offset
12150 = offset_from_vma (file, entry->d_un.d_val,
12151 liblistno * sizeof (Elf32_External_Lib));
12152 break;
12153 case DT_MIPS_LIBLISTNO:
12154 liblistno = entry->d_un.d_val;
12155 break;
12156 case DT_MIPS_OPTIONS:
12157 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
12158 break;
12159 case DT_MIPS_CONFLICT:
12160 conflicts_offset
12161 = offset_from_vma (file, entry->d_un.d_val,
12162 conflictsno * sizeof (Elf32_External_Conflict));
12163 break;
12164 case DT_MIPS_CONFLICTNO:
12165 conflictsno = entry->d_un.d_val;
12166 break;
12167 case DT_PLTGOT:
12168 pltgot = entry->d_un.d_ptr;
12169 break;
12170 case DT_MIPS_LOCAL_GOTNO:
12171 local_gotno = entry->d_un.d_val;
12172 break;
12173 case DT_MIPS_GOTSYM:
12174 gotsym = entry->d_un.d_val;
12175 break;
12176 case DT_MIPS_SYMTABNO:
12177 symtabno = entry->d_un.d_val;
12178 break;
12179 case DT_MIPS_PLTGOT:
12180 mips_pltgot = entry->d_un.d_ptr;
12181 break;
12182 case DT_PLTREL:
12183 pltrel = entry->d_un.d_val;
12184 break;
12185 case DT_PLTRELSZ:
12186 pltrelsz = entry->d_un.d_val;
12187 break;
12188 case DT_JMPREL:
12189 jmprel = entry->d_un.d_ptr;
12190 break;
12191 default:
12192 break;
12193 }
12194
12195 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
12196 {
12197 Elf32_External_Lib * elib;
12198 size_t cnt;
12199
12200 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12201 liblistno,
12202 sizeof (Elf32_External_Lib),
12203 _("liblist section data"));
12204 if (elib)
12205 {
12206 printf (_("\nSection '.liblist' contains %lu entries:\n"),
12207 (unsigned long) liblistno);
12208 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
12209 stdout);
12210
12211 for (cnt = 0; cnt < liblistno; ++cnt)
12212 {
12213 Elf32_Lib liblist;
12214 time_t atime;
12215 char timebuf[20];
12216 struct tm * tmp;
12217
12218 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12219 atime = BYTE_GET (elib[cnt].l_time_stamp);
12220 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12221 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12222 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12223
12224 tmp = gmtime (&atime);
12225 snprintf (timebuf, sizeof (timebuf),
12226 "%04u-%02u-%02uT%02u:%02u:%02u",
12227 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12228 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12229
12230 printf ("%3lu: ", (unsigned long) cnt);
12231 if (VALID_DYNAMIC_NAME (liblist.l_name))
12232 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12233 else
12234 printf (_("<corrupt: %9ld>"), liblist.l_name);
12235 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12236 liblist.l_version);
12237
12238 if (liblist.l_flags == 0)
12239 puts (_(" NONE"));
12240 else
12241 {
12242 static const struct
12243 {
12244 const char * name;
12245 int bit;
12246 }
12247 l_flags_vals[] =
12248 {
12249 { " EXACT_MATCH", LL_EXACT_MATCH },
12250 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12251 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12252 { " EXPORTS", LL_EXPORTS },
12253 { " DELAY_LOAD", LL_DELAY_LOAD },
12254 { " DELTA", LL_DELTA }
12255 };
12256 int flags = liblist.l_flags;
12257 size_t fcnt;
12258
12259 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12260 if ((flags & l_flags_vals[fcnt].bit) != 0)
12261 {
12262 fputs (l_flags_vals[fcnt].name, stdout);
12263 flags ^= l_flags_vals[fcnt].bit;
12264 }
12265 if (flags != 0)
12266 printf (" %#x", (unsigned int) flags);
12267
12268 puts ("");
12269 }
12270 }
12271
12272 free (elib);
12273 }
12274 }
12275
12276 if (options_offset != 0)
12277 {
12278 Elf_External_Options * eopt;
12279 Elf_Internal_Shdr * sect = section_headers;
12280 Elf_Internal_Options * iopt;
12281 Elf_Internal_Options * option;
12282 size_t offset;
12283 int cnt;
12284
12285 /* Find the section header so that we get the size. */
12286 while (sect->sh_type != SHT_MIPS_OPTIONS)
12287 ++sect;
12288
12289 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12290 sect->sh_size, _("options"));
12291 if (eopt)
12292 {
12293 iopt = (Elf_Internal_Options *)
12294 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12295 if (iopt == NULL)
12296 {
12297 error (_("Out of memory\n"));
12298 return 0;
12299 }
12300
12301 offset = cnt = 0;
12302 option = iopt;
12303
12304 while (offset < sect->sh_size)
12305 {
12306 Elf_External_Options * eoption;
12307
12308 eoption = (Elf_External_Options *) ((char *) eopt + offset);
12309
12310 option->kind = BYTE_GET (eoption->kind);
12311 option->size = BYTE_GET (eoption->size);
12312 option->section = BYTE_GET (eoption->section);
12313 option->info = BYTE_GET (eoption->info);
12314
12315 offset += option->size;
12316
12317 ++option;
12318 ++cnt;
12319 }
12320
12321 printf (_("\nSection '%s' contains %d entries:\n"),
12322 SECTION_NAME (sect), cnt);
12323
12324 option = iopt;
12325
12326 while (cnt-- > 0)
12327 {
12328 size_t len;
12329
12330 switch (option->kind)
12331 {
12332 case ODK_NULL:
12333 /* This shouldn't happen. */
12334 printf (" NULL %d %lx", option->section, option->info);
12335 break;
12336 case ODK_REGINFO:
12337 printf (" REGINFO ");
12338 if (elf_header.e_machine == EM_MIPS)
12339 {
12340 /* 32bit form. */
12341 Elf32_External_RegInfo * ereg;
12342 Elf32_RegInfo reginfo;
12343
12344 ereg = (Elf32_External_RegInfo *) (option + 1);
12345 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12346 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12347 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12348 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12349 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12350 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12351
12352 printf ("GPR %08lx GP 0x%lx\n",
12353 reginfo.ri_gprmask,
12354 (unsigned long) reginfo.ri_gp_value);
12355 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
12356 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12357 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12358 }
12359 else
12360 {
12361 /* 64 bit form. */
12362 Elf64_External_RegInfo * ereg;
12363 Elf64_Internal_RegInfo reginfo;
12364
12365 ereg = (Elf64_External_RegInfo *) (option + 1);
12366 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12367 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12368 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12369 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12370 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12371 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12372
12373 printf ("GPR %08lx GP 0x",
12374 reginfo.ri_gprmask);
12375 printf_vma (reginfo.ri_gp_value);
12376 printf ("\n");
12377
12378 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
12379 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12380 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12381 }
12382 ++option;
12383 continue;
12384 case ODK_EXCEPTIONS:
12385 fputs (" EXCEPTIONS fpe_min(", stdout);
12386 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
12387 fputs (") fpe_max(", stdout);
12388 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
12389 fputs (")", stdout);
12390
12391 if (option->info & OEX_PAGE0)
12392 fputs (" PAGE0", stdout);
12393 if (option->info & OEX_SMM)
12394 fputs (" SMM", stdout);
12395 if (option->info & OEX_FPDBUG)
12396 fputs (" FPDBUG", stdout);
12397 if (option->info & OEX_DISMISS)
12398 fputs (" DISMISS", stdout);
12399 break;
12400 case ODK_PAD:
12401 fputs (" PAD ", stdout);
12402 if (option->info & OPAD_PREFIX)
12403 fputs (" PREFIX", stdout);
12404 if (option->info & OPAD_POSTFIX)
12405 fputs (" POSTFIX", stdout);
12406 if (option->info & OPAD_SYMBOL)
12407 fputs (" SYMBOL", stdout);
12408 break;
12409 case ODK_HWPATCH:
12410 fputs (" HWPATCH ", stdout);
12411 if (option->info & OHW_R4KEOP)
12412 fputs (" R4KEOP", stdout);
12413 if (option->info & OHW_R8KPFETCH)
12414 fputs (" R8KPFETCH", stdout);
12415 if (option->info & OHW_R5KEOP)
12416 fputs (" R5KEOP", stdout);
12417 if (option->info & OHW_R5KCVTL)
12418 fputs (" R5KCVTL", stdout);
12419 break;
12420 case ODK_FILL:
12421 fputs (" FILL ", stdout);
12422 /* XXX Print content of info word? */
12423 break;
12424 case ODK_TAGS:
12425 fputs (" TAGS ", stdout);
12426 /* XXX Print content of info word? */
12427 break;
12428 case ODK_HWAND:
12429 fputs (" HWAND ", stdout);
12430 if (option->info & OHWA0_R4KEOP_CHECKED)
12431 fputs (" R4KEOP_CHECKED", stdout);
12432 if (option->info & OHWA0_R4KEOP_CLEAN)
12433 fputs (" R4KEOP_CLEAN", stdout);
12434 break;
12435 case ODK_HWOR:
12436 fputs (" HWOR ", stdout);
12437 if (option->info & OHWA0_R4KEOP_CHECKED)
12438 fputs (" R4KEOP_CHECKED", stdout);
12439 if (option->info & OHWA0_R4KEOP_CLEAN)
12440 fputs (" R4KEOP_CLEAN", stdout);
12441 break;
12442 case ODK_GP_GROUP:
12443 printf (" GP_GROUP %#06lx self-contained %#06lx",
12444 option->info & OGP_GROUP,
12445 (option->info & OGP_SELF) >> 16);
12446 break;
12447 case ODK_IDENT:
12448 printf (" IDENT %#06lx self-contained %#06lx",
12449 option->info & OGP_GROUP,
12450 (option->info & OGP_SELF) >> 16);
12451 break;
12452 default:
12453 /* This shouldn't happen. */
12454 printf (" %3d ??? %d %lx",
12455 option->kind, option->section, option->info);
12456 break;
12457 }
12458
12459 len = sizeof (* eopt);
12460 while (len < option->size)
12461 if (((char *) option)[len] >= ' '
12462 && ((char *) option)[len] < 0x7f)
12463 printf ("%c", ((char *) option)[len++]);
12464 else
12465 printf ("\\%03o", ((char *) option)[len++]);
12466
12467 fputs ("\n", stdout);
12468 ++option;
12469 }
12470
12471 free (eopt);
12472 }
12473 }
12474
12475 if (conflicts_offset != 0 && conflictsno != 0)
12476 {
12477 Elf32_Conflict * iconf;
12478 size_t cnt;
12479
12480 if (dynamic_symbols == NULL)
12481 {
12482 error (_("conflict list found without a dynamic symbol table\n"));
12483 return 0;
12484 }
12485
12486 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
12487 if (iconf == NULL)
12488 {
12489 error (_("Out of memory\n"));
12490 return 0;
12491 }
12492
12493 if (is_32bit_elf)
12494 {
12495 Elf32_External_Conflict * econf32;
12496
12497 econf32 = (Elf32_External_Conflict *)
12498 get_data (NULL, file, conflicts_offset, conflictsno,
12499 sizeof (* econf32), _("conflict"));
12500 if (!econf32)
12501 return 0;
12502
12503 for (cnt = 0; cnt < conflictsno; ++cnt)
12504 iconf[cnt] = BYTE_GET (econf32[cnt]);
12505
12506 free (econf32);
12507 }
12508 else
12509 {
12510 Elf64_External_Conflict * econf64;
12511
12512 econf64 = (Elf64_External_Conflict *)
12513 get_data (NULL, file, conflicts_offset, conflictsno,
12514 sizeof (* econf64), _("conflict"));
12515 if (!econf64)
12516 return 0;
12517
12518 for (cnt = 0; cnt < conflictsno; ++cnt)
12519 iconf[cnt] = BYTE_GET (econf64[cnt]);
12520
12521 free (econf64);
12522 }
12523
12524 printf (_("\nSection '.conflict' contains %lu entries:\n"),
12525 (unsigned long) conflictsno);
12526 puts (_(" Num: Index Value Name"));
12527
12528 for (cnt = 0; cnt < conflictsno; ++cnt)
12529 {
12530 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
12531
12532 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
12533 print_vma (psym->st_value, FULL_HEX);
12534 putchar (' ');
12535 if (VALID_DYNAMIC_NAME (psym->st_name))
12536 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
12537 else
12538 printf (_("<corrupt: %14ld>"), psym->st_name);
12539 putchar ('\n');
12540 }
12541
12542 free (iconf);
12543 }
12544
12545 if (pltgot != 0 && local_gotno != 0)
12546 {
12547 bfd_vma ent, local_end, global_end;
12548 size_t i, offset;
12549 unsigned char * data;
12550 int addr_size;
12551
12552 ent = pltgot;
12553 addr_size = (is_32bit_elf ? 4 : 8);
12554 local_end = pltgot + local_gotno * addr_size;
12555 global_end = local_end + (symtabno - gotsym) * addr_size;
12556
12557 offset = offset_from_vma (file, pltgot, global_end - pltgot);
12558 data = (unsigned char *) get_data (NULL, file, offset,
12559 global_end - pltgot, 1,
12560 _("Global Offset Table data"));
12561 if (data == NULL)
12562 return 0;
12563
12564 printf (_("\nPrimary GOT:\n"));
12565 printf (_(" Canonical gp value: "));
12566 print_vma (pltgot + 0x7ff0, LONG_HEX);
12567 printf ("\n\n");
12568
12569 printf (_(" Reserved entries:\n"));
12570 printf (_(" %*s %10s %*s Purpose\n"),
12571 addr_size * 2, _("Address"), _("Access"),
12572 addr_size * 2, _("Initial"));
12573 ent = print_mips_got_entry (data, pltgot, ent);
12574 printf (_(" Lazy resolver\n"));
12575 if (data
12576 && (byte_get (data + ent - pltgot, addr_size)
12577 >> (addr_size * 8 - 1)) != 0)
12578 {
12579 ent = print_mips_got_entry (data, pltgot, ent);
12580 printf (_(" Module pointer (GNU extension)\n"));
12581 }
12582 printf ("\n");
12583
12584 if (ent < local_end)
12585 {
12586 printf (_(" Local entries:\n"));
12587 printf (" %*s %10s %*s\n",
12588 addr_size * 2, _("Address"), _("Access"),
12589 addr_size * 2, _("Initial"));
12590 while (ent < local_end)
12591 {
12592 ent = print_mips_got_entry (data, pltgot, ent);
12593 printf ("\n");
12594 }
12595 printf ("\n");
12596 }
12597
12598 if (gotsym < symtabno)
12599 {
12600 int sym_width;
12601
12602 printf (_(" Global entries:\n"));
12603 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
12604 addr_size * 2, _("Address"),
12605 _("Access"),
12606 addr_size * 2, _("Initial"),
12607 addr_size * 2, _("Sym.Val."),
12608 _("Type"),
12609 /* Note for translators: "Ndx" = abbreviated form of "Index". */
12610 _("Ndx"), _("Name"));
12611
12612 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12613 for (i = gotsym; i < symtabno; i++)
12614 {
12615 Elf_Internal_Sym * psym;
12616
12617 psym = dynamic_symbols + i;
12618 ent = print_mips_got_entry (data, pltgot, ent);
12619 printf (" ");
12620 print_vma (psym->st_value, LONG_HEX);
12621 printf (" %-7s %3s ",
12622 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12623 get_symbol_index_type (psym->st_shndx));
12624 if (VALID_DYNAMIC_NAME (psym->st_name))
12625 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12626 else
12627 printf (_("<corrupt: %14ld>"), psym->st_name);
12628 printf ("\n");
12629 }
12630 printf ("\n");
12631 }
12632
12633 if (data)
12634 free (data);
12635 }
12636
12637 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12638 {
12639 bfd_vma ent, end;
12640 size_t offset, rel_offset;
12641 unsigned long count, i;
12642 unsigned char * data;
12643 int addr_size, sym_width;
12644 Elf_Internal_Rela * rels;
12645
12646 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12647 if (pltrel == DT_RELA)
12648 {
12649 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12650 return 0;
12651 }
12652 else
12653 {
12654 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12655 return 0;
12656 }
12657
12658 ent = mips_pltgot;
12659 addr_size = (is_32bit_elf ? 4 : 8);
12660 end = mips_pltgot + (2 + count) * addr_size;
12661
12662 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12663 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12664 1, _("Procedure Linkage Table data"));
12665 if (data == NULL)
12666 return 0;
12667
12668 printf ("\nPLT GOT:\n\n");
12669 printf (_(" Reserved entries:\n"));
12670 printf (_(" %*s %*s Purpose\n"),
12671 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12672 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12673 printf (_(" PLT lazy resolver\n"));
12674 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12675 printf (_(" Module pointer\n"));
12676 printf ("\n");
12677
12678 printf (_(" Entries:\n"));
12679 printf (" %*s %*s %*s %-7s %3s %s\n",
12680 addr_size * 2, _("Address"),
12681 addr_size * 2, _("Initial"),
12682 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12683 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12684 for (i = 0; i < count; i++)
12685 {
12686 Elf_Internal_Sym * psym;
12687
12688 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12689 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12690 printf (" ");
12691 print_vma (psym->st_value, LONG_HEX);
12692 printf (" %-7s %3s ",
12693 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12694 get_symbol_index_type (psym->st_shndx));
12695 if (VALID_DYNAMIC_NAME (psym->st_name))
12696 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12697 else
12698 printf (_("<corrupt: %14ld>"), psym->st_name);
12699 printf ("\n");
12700 }
12701 printf ("\n");
12702
12703 if (data)
12704 free (data);
12705 free (rels);
12706 }
12707
12708 return 1;
12709 }
12710
12711 static int
12712 process_gnu_liblist (FILE * file)
12713 {
12714 Elf_Internal_Shdr * section;
12715 Elf_Internal_Shdr * string_sec;
12716 Elf32_External_Lib * elib;
12717 char * strtab;
12718 size_t strtab_size;
12719 size_t cnt;
12720 unsigned i;
12721
12722 if (! do_arch)
12723 return 0;
12724
12725 for (i = 0, section = section_headers;
12726 i < elf_header.e_shnum;
12727 i++, section++)
12728 {
12729 switch (section->sh_type)
12730 {
12731 case SHT_GNU_LIBLIST:
12732 if (section->sh_link >= elf_header.e_shnum)
12733 break;
12734
12735 elib = (Elf32_External_Lib *)
12736 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12737 _("liblist section data"));
12738
12739 if (elib == NULL)
12740 break;
12741 string_sec = section_headers + section->sh_link;
12742
12743 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12744 string_sec->sh_size,
12745 _("liblist string table"));
12746 if (strtab == NULL
12747 || section->sh_entsize != sizeof (Elf32_External_Lib))
12748 {
12749 free (elib);
12750 free (strtab);
12751 break;
12752 }
12753 strtab_size = string_sec->sh_size;
12754
12755 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
12756 SECTION_NAME (section),
12757 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
12758
12759 puts (_(" Library Time Stamp Checksum Version Flags"));
12760
12761 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
12762 ++cnt)
12763 {
12764 Elf32_Lib liblist;
12765 time_t atime;
12766 char timebuf[20];
12767 struct tm * tmp;
12768
12769 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12770 atime = BYTE_GET (elib[cnt].l_time_stamp);
12771 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12772 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12773 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12774
12775 tmp = gmtime (&atime);
12776 snprintf (timebuf, sizeof (timebuf),
12777 "%04u-%02u-%02uT%02u:%02u:%02u",
12778 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12779 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12780
12781 printf ("%3lu: ", (unsigned long) cnt);
12782 if (do_wide)
12783 printf ("%-20s", liblist.l_name < strtab_size
12784 ? strtab + liblist.l_name : _("<corrupt>"));
12785 else
12786 printf ("%-20.20s", liblist.l_name < strtab_size
12787 ? strtab + liblist.l_name : _("<corrupt>"));
12788 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
12789 liblist.l_version, liblist.l_flags);
12790 }
12791
12792 free (elib);
12793 free (strtab);
12794 }
12795 }
12796
12797 return 1;
12798 }
12799
12800 static const char *
12801 get_note_type (unsigned e_type)
12802 {
12803 static char buff[64];
12804
12805 if (elf_header.e_type == ET_CORE)
12806 switch (e_type)
12807 {
12808 case NT_AUXV:
12809 return _("NT_AUXV (auxiliary vector)");
12810 case NT_PRSTATUS:
12811 return _("NT_PRSTATUS (prstatus structure)");
12812 case NT_FPREGSET:
12813 return _("NT_FPREGSET (floating point registers)");
12814 case NT_PRPSINFO:
12815 return _("NT_PRPSINFO (prpsinfo structure)");
12816 case NT_TASKSTRUCT:
12817 return _("NT_TASKSTRUCT (task structure)");
12818 case NT_PRXFPREG:
12819 return _("NT_PRXFPREG (user_xfpregs structure)");
12820 case NT_PPC_VMX:
12821 return _("NT_PPC_VMX (ppc Altivec registers)");
12822 case NT_PPC_VSX:
12823 return _("NT_PPC_VSX (ppc VSX registers)");
12824 case NT_386_TLS:
12825 return _("NT_386_TLS (x86 TLS information)");
12826 case NT_386_IOPERM:
12827 return _("NT_386_IOPERM (x86 I/O permissions)");
12828 case NT_X86_XSTATE:
12829 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
12830 case NT_S390_HIGH_GPRS:
12831 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
12832 case NT_S390_TIMER:
12833 return _("NT_S390_TIMER (s390 timer register)");
12834 case NT_S390_TODCMP:
12835 return _("NT_S390_TODCMP (s390 TOD comparator register)");
12836 case NT_S390_TODPREG:
12837 return _("NT_S390_TODPREG (s390 TOD programmable register)");
12838 case NT_S390_CTRS:
12839 return _("NT_S390_CTRS (s390 control registers)");
12840 case NT_S390_PREFIX:
12841 return _("NT_S390_PREFIX (s390 prefix register)");
12842 case NT_S390_LAST_BREAK:
12843 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
12844 case NT_S390_SYSTEM_CALL:
12845 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
12846 case NT_S390_TDB:
12847 return _("NT_S390_TDB (s390 transaction diagnostic block)");
12848 case NT_ARM_VFP:
12849 return _("NT_ARM_VFP (arm VFP registers)");
12850 case NT_ARM_TLS:
12851 return _("NT_ARM_TLS (AArch TLS registers)");
12852 case NT_ARM_HW_BREAK:
12853 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
12854 case NT_ARM_HW_WATCH:
12855 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
12856 case NT_PSTATUS:
12857 return _("NT_PSTATUS (pstatus structure)");
12858 case NT_FPREGS:
12859 return _("NT_FPREGS (floating point registers)");
12860 case NT_PSINFO:
12861 return _("NT_PSINFO (psinfo structure)");
12862 case NT_LWPSTATUS:
12863 return _("NT_LWPSTATUS (lwpstatus_t structure)");
12864 case NT_LWPSINFO:
12865 return _("NT_LWPSINFO (lwpsinfo_t structure)");
12866 case NT_WIN32PSTATUS:
12867 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
12868 case NT_SIGINFO:
12869 return _("NT_SIGINFO (siginfo_t data)");
12870 case NT_FILE:
12871 return _("NT_FILE (mapped files)");
12872 default:
12873 break;
12874 }
12875 else
12876 switch (e_type)
12877 {
12878 case NT_VERSION:
12879 return _("NT_VERSION (version)");
12880 case NT_ARCH:
12881 return _("NT_ARCH (architecture)");
12882 default:
12883 break;
12884 }
12885
12886 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12887 return buff;
12888 }
12889
12890 static int
12891 print_core_note (Elf_Internal_Note *pnote)
12892 {
12893 unsigned int addr_size = is_32bit_elf ? 4 : 8;
12894 bfd_vma count, page_size;
12895 unsigned char *descdata, *filenames, *descend;
12896
12897 if (pnote->type != NT_FILE)
12898 return 1;
12899
12900 #ifndef BFD64
12901 if (!is_32bit_elf)
12902 {
12903 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
12904 /* Still "successful". */
12905 return 1;
12906 }
12907 #endif
12908
12909 if (pnote->descsz < 2 * addr_size)
12910 {
12911 printf (_(" Malformed note - too short for header\n"));
12912 return 0;
12913 }
12914
12915 descdata = (unsigned char *) pnote->descdata;
12916 descend = descdata + pnote->descsz;
12917
12918 if (descdata[pnote->descsz - 1] != '\0')
12919 {
12920 printf (_(" Malformed note - does not end with \\0\n"));
12921 return 0;
12922 }
12923
12924 count = byte_get (descdata, addr_size);
12925 descdata += addr_size;
12926
12927 page_size = byte_get (descdata, addr_size);
12928 descdata += addr_size;
12929
12930 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
12931 {
12932 printf (_(" Malformed note - too short for supplied file count\n"));
12933 return 0;
12934 }
12935
12936 printf (_(" Page size: "));
12937 print_vma (page_size, DEC);
12938 printf ("\n");
12939
12940 printf (_(" %*s%*s%*s\n"),
12941 (int) (2 + 2 * addr_size), _("Start"),
12942 (int) (4 + 2 * addr_size), _("End"),
12943 (int) (4 + 2 * addr_size), _("Page Offset"));
12944 filenames = descdata + count * 3 * addr_size;
12945 while (--count > 0)
12946 {
12947 bfd_vma start, end, file_ofs;
12948
12949 if (filenames == descend)
12950 {
12951 printf (_(" Malformed note - filenames end too early\n"));
12952 return 0;
12953 }
12954
12955 start = byte_get (descdata, addr_size);
12956 descdata += addr_size;
12957 end = byte_get (descdata, addr_size);
12958 descdata += addr_size;
12959 file_ofs = byte_get (descdata, addr_size);
12960 descdata += addr_size;
12961
12962 printf (" ");
12963 print_vma (start, FULL_HEX);
12964 printf (" ");
12965 print_vma (end, FULL_HEX);
12966 printf (" ");
12967 print_vma (file_ofs, FULL_HEX);
12968 printf ("\n %s\n", filenames);
12969
12970 filenames += 1 + strlen ((char *) filenames);
12971 }
12972
12973 return 1;
12974 }
12975
12976 static const char *
12977 get_gnu_elf_note_type (unsigned e_type)
12978 {
12979 static char buff[64];
12980
12981 switch (e_type)
12982 {
12983 case NT_GNU_ABI_TAG:
12984 return _("NT_GNU_ABI_TAG (ABI version tag)");
12985 case NT_GNU_HWCAP:
12986 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
12987 case NT_GNU_BUILD_ID:
12988 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
12989 case NT_GNU_GOLD_VERSION:
12990 return _("NT_GNU_GOLD_VERSION (gold version)");
12991 default:
12992 break;
12993 }
12994
12995 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12996 return buff;
12997 }
12998
12999 static int
13000 print_gnu_note (Elf_Internal_Note *pnote)
13001 {
13002 switch (pnote->type)
13003 {
13004 case NT_GNU_BUILD_ID:
13005 {
13006 unsigned long i;
13007
13008 printf (_(" Build ID: "));
13009 for (i = 0; i < pnote->descsz; ++i)
13010 printf ("%02x", pnote->descdata[i] & 0xff);
13011 printf ("\n");
13012 }
13013 break;
13014
13015 case NT_GNU_ABI_TAG:
13016 {
13017 unsigned long os, major, minor, subminor;
13018 const char *osname;
13019
13020 os = byte_get ((unsigned char *) pnote->descdata, 4);
13021 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13022 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13023 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13024
13025 switch (os)
13026 {
13027 case GNU_ABI_TAG_LINUX:
13028 osname = "Linux";
13029 break;
13030 case GNU_ABI_TAG_HURD:
13031 osname = "Hurd";
13032 break;
13033 case GNU_ABI_TAG_SOLARIS:
13034 osname = "Solaris";
13035 break;
13036 case GNU_ABI_TAG_FREEBSD:
13037 osname = "FreeBSD";
13038 break;
13039 case GNU_ABI_TAG_NETBSD:
13040 osname = "NetBSD";
13041 break;
13042 default:
13043 osname = "Unknown";
13044 break;
13045 }
13046
13047 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13048 major, minor, subminor);
13049 }
13050 break;
13051 }
13052
13053 return 1;
13054 }
13055
13056 static const char *
13057 get_netbsd_elfcore_note_type (unsigned e_type)
13058 {
13059 static char buff[64];
13060
13061 if (e_type == NT_NETBSDCORE_PROCINFO)
13062 {
13063 /* NetBSD core "procinfo" structure. */
13064 return _("NetBSD procinfo structure");
13065 }
13066
13067 /* As of Jan 2002 there are no other machine-independent notes
13068 defined for NetBSD core files. If the note type is less
13069 than the start of the machine-dependent note types, we don't
13070 understand it. */
13071
13072 if (e_type < NT_NETBSDCORE_FIRSTMACH)
13073 {
13074 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13075 return buff;
13076 }
13077
13078 switch (elf_header.e_machine)
13079 {
13080 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
13081 and PT_GETFPREGS == mach+2. */
13082
13083 case EM_OLD_ALPHA:
13084 case EM_ALPHA:
13085 case EM_SPARC:
13086 case EM_SPARC32PLUS:
13087 case EM_SPARCV9:
13088 switch (e_type)
13089 {
13090 case NT_NETBSDCORE_FIRSTMACH + 0:
13091 return _("PT_GETREGS (reg structure)");
13092 case NT_NETBSDCORE_FIRSTMACH + 2:
13093 return _("PT_GETFPREGS (fpreg structure)");
13094 default:
13095 break;
13096 }
13097 break;
13098
13099 /* On all other arch's, PT_GETREGS == mach+1 and
13100 PT_GETFPREGS == mach+3. */
13101 default:
13102 switch (e_type)
13103 {
13104 case NT_NETBSDCORE_FIRSTMACH + 1:
13105 return _("PT_GETREGS (reg structure)");
13106 case NT_NETBSDCORE_FIRSTMACH + 3:
13107 return _("PT_GETFPREGS (fpreg structure)");
13108 default:
13109 break;
13110 }
13111 }
13112
13113 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
13114 e_type - NT_NETBSDCORE_FIRSTMACH);
13115 return buff;
13116 }
13117
13118 static const char *
13119 get_stapsdt_note_type (unsigned e_type)
13120 {
13121 static char buff[64];
13122
13123 switch (e_type)
13124 {
13125 case NT_STAPSDT:
13126 return _("NT_STAPSDT (SystemTap probe descriptors)");
13127
13128 default:
13129 break;
13130 }
13131
13132 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13133 return buff;
13134 }
13135
13136 static int
13137 print_stapsdt_note (Elf_Internal_Note *pnote)
13138 {
13139 int addr_size = is_32bit_elf ? 4 : 8;
13140 char *data = pnote->descdata;
13141 char *data_end = pnote->descdata + pnote->descsz;
13142 bfd_vma pc, base_addr, semaphore;
13143 char *provider, *probe, *arg_fmt;
13144
13145 pc = byte_get ((unsigned char *) data, addr_size);
13146 data += addr_size;
13147 base_addr = byte_get ((unsigned char *) data, addr_size);
13148 data += addr_size;
13149 semaphore = byte_get ((unsigned char *) data, addr_size);
13150 data += addr_size;
13151
13152 provider = data;
13153 data += strlen (data) + 1;
13154 probe = data;
13155 data += strlen (data) + 1;
13156 arg_fmt = data;
13157 data += strlen (data) + 1;
13158
13159 printf (_(" Provider: %s\n"), provider);
13160 printf (_(" Name: %s\n"), probe);
13161 printf (_(" Location: "));
13162 print_vma (pc, FULL_HEX);
13163 printf (_(", Base: "));
13164 print_vma (base_addr, FULL_HEX);
13165 printf (_(", Semaphore: "));
13166 print_vma (semaphore, FULL_HEX);
13167 printf ("\n");
13168 printf (_(" Arguments: %s\n"), arg_fmt);
13169
13170 return data == data_end;
13171 }
13172
13173 static const char *
13174 get_ia64_vms_note_type (unsigned e_type)
13175 {
13176 static char buff[64];
13177
13178 switch (e_type)
13179 {
13180 case NT_VMS_MHD:
13181 return _("NT_VMS_MHD (module header)");
13182 case NT_VMS_LNM:
13183 return _("NT_VMS_LNM (language name)");
13184 case NT_VMS_SRC:
13185 return _("NT_VMS_SRC (source files)");
13186 case NT_VMS_TITLE:
13187 return "NT_VMS_TITLE";
13188 case NT_VMS_EIDC:
13189 return _("NT_VMS_EIDC (consistency check)");
13190 case NT_VMS_FPMODE:
13191 return _("NT_VMS_FPMODE (FP mode)");
13192 case NT_VMS_LINKTIME:
13193 return "NT_VMS_LINKTIME";
13194 case NT_VMS_IMGNAM:
13195 return _("NT_VMS_IMGNAM (image name)");
13196 case NT_VMS_IMGID:
13197 return _("NT_VMS_IMGID (image id)");
13198 case NT_VMS_LINKID:
13199 return _("NT_VMS_LINKID (link id)");
13200 case NT_VMS_IMGBID:
13201 return _("NT_VMS_IMGBID (build id)");
13202 case NT_VMS_GSTNAM:
13203 return _("NT_VMS_GSTNAM (sym table name)");
13204 case NT_VMS_ORIG_DYN:
13205 return "NT_VMS_ORIG_DYN";
13206 case NT_VMS_PATCHTIME:
13207 return "NT_VMS_PATCHTIME";
13208 default:
13209 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13210 return buff;
13211 }
13212 }
13213
13214 static int
13215 print_ia64_vms_note (Elf_Internal_Note * pnote)
13216 {
13217 switch (pnote->type)
13218 {
13219 case NT_VMS_MHD:
13220 if (pnote->descsz > 36)
13221 {
13222 size_t l = strlen (pnote->descdata + 34);
13223 printf (_(" Creation date : %.17s\n"), pnote->descdata);
13224 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
13225 printf (_(" Module name : %s\n"), pnote->descdata + 34);
13226 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
13227 }
13228 else
13229 printf (_(" Invalid size\n"));
13230 break;
13231 case NT_VMS_LNM:
13232 printf (_(" Language: %s\n"), pnote->descdata);
13233 break;
13234 #ifdef BFD64
13235 case NT_VMS_FPMODE:
13236 printf (_(" Floating Point mode: "));
13237 printf ("0x%016" BFD_VMA_FMT "x\n",
13238 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13239 break;
13240 case NT_VMS_LINKTIME:
13241 printf (_(" Link time: "));
13242 print_vms_time
13243 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13244 printf ("\n");
13245 break;
13246 case NT_VMS_PATCHTIME:
13247 printf (_(" Patch time: "));
13248 print_vms_time
13249 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13250 printf ("\n");
13251 break;
13252 case NT_VMS_ORIG_DYN:
13253 printf (_(" Major id: %u, minor id: %u\n"),
13254 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13255 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13256 printf (_(" Last modified : "));
13257 print_vms_time
13258 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13259 printf (_("\n Link flags : "));
13260 printf ("0x%016" BFD_VMA_FMT "x\n",
13261 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
13262 printf (_(" Header flags: 0x%08x\n"),
13263 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
13264 printf (_(" Image id : %s\n"), pnote->descdata + 32);
13265 break;
13266 #endif
13267 case NT_VMS_IMGNAM:
13268 printf (_(" Image name: %s\n"), pnote->descdata);
13269 break;
13270 case NT_VMS_GSTNAM:
13271 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
13272 break;
13273 case NT_VMS_IMGID:
13274 printf (_(" Image id: %s\n"), pnote->descdata);
13275 break;
13276 case NT_VMS_LINKID:
13277 printf (_(" Linker id: %s\n"), pnote->descdata);
13278 break;
13279 default:
13280 break;
13281 }
13282 return 1;
13283 }
13284
13285 /* Note that by the ELF standard, the name field is already null byte
13286 terminated, and namesz includes the terminating null byte.
13287 I.E. the value of namesz for the name "FSF" is 4.
13288
13289 If the value of namesz is zero, there is no name present. */
13290 static int
13291 process_note (Elf_Internal_Note * pnote)
13292 {
13293 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
13294 const char * nt;
13295
13296 if (pnote->namesz == 0)
13297 /* If there is no note name, then use the default set of
13298 note type strings. */
13299 nt = get_note_type (pnote->type);
13300
13301 else if (const_strneq (pnote->namedata, "GNU"))
13302 /* GNU-specific object file notes. */
13303 nt = get_gnu_elf_note_type (pnote->type);
13304
13305 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
13306 /* NetBSD-specific core file notes. */
13307 nt = get_netbsd_elfcore_note_type (pnote->type);
13308
13309 else if (strneq (pnote->namedata, "SPU/", 4))
13310 {
13311 /* SPU-specific core file notes. */
13312 nt = pnote->namedata + 4;
13313 name = "SPU";
13314 }
13315
13316 else if (const_strneq (pnote->namedata, "IPF/VMS"))
13317 /* VMS/ia64-specific file notes. */
13318 nt = get_ia64_vms_note_type (pnote->type);
13319
13320 else if (const_strneq (pnote->namedata, "stapsdt"))
13321 nt = get_stapsdt_note_type (pnote->type);
13322
13323 else
13324 /* Don't recognize this note name; just use the default set of
13325 note type strings. */
13326 nt = get_note_type (pnote->type);
13327
13328 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
13329
13330 if (const_strneq (pnote->namedata, "IPF/VMS"))
13331 return print_ia64_vms_note (pnote);
13332 else if (const_strneq (pnote->namedata, "GNU"))
13333 return print_gnu_note (pnote);
13334 else if (const_strneq (pnote->namedata, "stapsdt"))
13335 return print_stapsdt_note (pnote);
13336 else if (const_strneq (pnote->namedata, "CORE"))
13337 return print_core_note (pnote);
13338 else
13339 return 1;
13340 }
13341
13342
13343 static int
13344 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
13345 {
13346 Elf_External_Note * pnotes;
13347 Elf_External_Note * external;
13348 int res = 1;
13349
13350 if (length <= 0)
13351 return 0;
13352
13353 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
13354 _("notes"));
13355 if (pnotes == NULL)
13356 return 0;
13357
13358 external = pnotes;
13359
13360 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
13361 (unsigned long) offset, (unsigned long) length);
13362 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
13363
13364 while ((char *) external < (char *) pnotes + length)
13365 {
13366 Elf_Internal_Note inote;
13367 size_t min_notesz;
13368 char *next;
13369 char * temp = NULL;
13370 size_t data_remaining = ((char *) pnotes + length) - (char *) external;
13371
13372 if (!is_ia64_vms ())
13373 {
13374 /* PR binutils/15191
13375 Make sure that there is enough data to read. */
13376 min_notesz = offsetof (Elf_External_Note, name);
13377 if (data_remaining < min_notesz)
13378 {
13379 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13380 (int) data_remaining);
13381 break;
13382 }
13383 inote.type = BYTE_GET (external->type);
13384 inote.namesz = BYTE_GET (external->namesz);
13385 inote.namedata = external->name;
13386 inote.descsz = BYTE_GET (external->descsz);
13387 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
13388 inote.descpos = offset + (inote.descdata - (char *) pnotes);
13389 next = inote.descdata + align_power (inote.descsz, 2);
13390 }
13391 else
13392 {
13393 Elf64_External_VMS_Note *vms_external;
13394
13395 /* PR binutils/15191
13396 Make sure that there is enough data to read. */
13397 min_notesz = offsetof (Elf64_External_VMS_Note, name);
13398 if (data_remaining < min_notesz)
13399 {
13400 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13401 (int) data_remaining);
13402 break;
13403 }
13404
13405 vms_external = (Elf64_External_VMS_Note *) external;
13406 inote.type = BYTE_GET (vms_external->type);
13407 inote.namesz = BYTE_GET (vms_external->namesz);
13408 inote.namedata = vms_external->name;
13409 inote.descsz = BYTE_GET (vms_external->descsz);
13410 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
13411 inote.descpos = offset + (inote.descdata - (char *) pnotes);
13412 next = inote.descdata + align_power (inote.descsz, 3);
13413 }
13414
13415 if (inote.descdata < (char *) external + min_notesz
13416 || next < (char *) external + min_notesz
13417 || data_remaining < (size_t)(next - (char *) external))
13418 {
13419 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
13420 (unsigned long) ((char *) external - (char *) pnotes));
13421 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
13422 inote.type, inote.namesz, inote.descsz);
13423 break;
13424 }
13425
13426 external = (Elf_External_Note *) next;
13427
13428 /* Verify that name is null terminated. It appears that at least
13429 one version of Linux (RedHat 6.0) generates corefiles that don't
13430 comply with the ELF spec by failing to include the null byte in
13431 namesz. */
13432 if (inote.namedata[inote.namesz - 1] != '\0')
13433 {
13434 temp = (char *) malloc (inote.namesz + 1);
13435
13436 if (temp == NULL)
13437 {
13438 error (_("Out of memory\n"));
13439 res = 0;
13440 break;
13441 }
13442
13443 strncpy (temp, inote.namedata, inote.namesz);
13444 temp[inote.namesz] = 0;
13445
13446 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
13447 inote.namedata = temp;
13448 }
13449
13450 res &= process_note (& inote);
13451
13452 if (temp != NULL)
13453 {
13454 free (temp);
13455 temp = NULL;
13456 }
13457 }
13458
13459 free (pnotes);
13460
13461 return res;
13462 }
13463
13464 static int
13465 process_corefile_note_segments (FILE * file)
13466 {
13467 Elf_Internal_Phdr * segment;
13468 unsigned int i;
13469 int res = 1;
13470
13471 if (! get_program_headers (file))
13472 return 0;
13473
13474 for (i = 0, segment = program_headers;
13475 i < elf_header.e_phnum;
13476 i++, segment++)
13477 {
13478 if (segment->p_type == PT_NOTE)
13479 res &= process_corefile_note_segment (file,
13480 (bfd_vma) segment->p_offset,
13481 (bfd_vma) segment->p_filesz);
13482 }
13483
13484 return res;
13485 }
13486
13487 static int
13488 process_note_sections (FILE * file)
13489 {
13490 Elf_Internal_Shdr * section;
13491 unsigned long i;
13492 int res = 1;
13493
13494 for (i = 0, section = section_headers;
13495 i < elf_header.e_shnum && section != NULL;
13496 i++, section++)
13497 if (section->sh_type == SHT_NOTE)
13498 res &= process_corefile_note_segment (file,
13499 (bfd_vma) section->sh_offset,
13500 (bfd_vma) section->sh_size);
13501
13502 return res;
13503 }
13504
13505 static int
13506 process_notes (FILE * file)
13507 {
13508 /* If we have not been asked to display the notes then do nothing. */
13509 if (! do_notes)
13510 return 1;
13511
13512 if (elf_header.e_type != ET_CORE)
13513 return process_note_sections (file);
13514
13515 /* No program headers means no NOTE segment. */
13516 if (elf_header.e_phnum > 0)
13517 return process_corefile_note_segments (file);
13518
13519 printf (_("No note segments present in the core file.\n"));
13520 return 1;
13521 }
13522
13523 static int
13524 process_arch_specific (FILE * file)
13525 {
13526 if (! do_arch)
13527 return 1;
13528
13529 switch (elf_header.e_machine)
13530 {
13531 case EM_ARM:
13532 return process_arm_specific (file);
13533 case EM_MIPS:
13534 case EM_MIPS_RS3_LE:
13535 return process_mips_specific (file);
13536 break;
13537 case EM_PPC:
13538 return process_power_specific (file);
13539 break;
13540 case EM_SPARC:
13541 case EM_SPARC32PLUS:
13542 case EM_SPARCV9:
13543 return process_sparc_specific (file);
13544 break;
13545 case EM_TI_C6000:
13546 return process_tic6x_specific (file);
13547 break;
13548 default:
13549 break;
13550 }
13551 return 1;
13552 }
13553
13554 static int
13555 get_file_header (FILE * file)
13556 {
13557 /* Read in the identity array. */
13558 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
13559 return 0;
13560
13561 /* Determine how to read the rest of the header. */
13562 switch (elf_header.e_ident[EI_DATA])
13563 {
13564 default: /* fall through */
13565 case ELFDATANONE: /* fall through */
13566 case ELFDATA2LSB:
13567 byte_get = byte_get_little_endian;
13568 byte_put = byte_put_little_endian;
13569 break;
13570 case ELFDATA2MSB:
13571 byte_get = byte_get_big_endian;
13572 byte_put = byte_put_big_endian;
13573 break;
13574 }
13575
13576 /* For now we only support 32 bit and 64 bit ELF files. */
13577 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
13578
13579 /* Read in the rest of the header. */
13580 if (is_32bit_elf)
13581 {
13582 Elf32_External_Ehdr ehdr32;
13583
13584 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
13585 return 0;
13586
13587 elf_header.e_type = BYTE_GET (ehdr32.e_type);
13588 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
13589 elf_header.e_version = BYTE_GET (ehdr32.e_version);
13590 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
13591 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
13592 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
13593 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
13594 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
13595 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
13596 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
13597 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
13598 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
13599 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
13600 }
13601 else
13602 {
13603 Elf64_External_Ehdr ehdr64;
13604
13605 /* If we have been compiled with sizeof (bfd_vma) == 4, then
13606 we will not be able to cope with the 64bit data found in
13607 64 ELF files. Detect this now and abort before we start
13608 overwriting things. */
13609 if (sizeof (bfd_vma) < 8)
13610 {
13611 error (_("This instance of readelf has been built without support for a\n\
13612 64 bit data type and so it cannot read 64 bit ELF files.\n"));
13613 return 0;
13614 }
13615
13616 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
13617 return 0;
13618
13619 elf_header.e_type = BYTE_GET (ehdr64.e_type);
13620 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
13621 elf_header.e_version = BYTE_GET (ehdr64.e_version);
13622 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
13623 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
13624 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
13625 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
13626 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
13627 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
13628 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
13629 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
13630 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
13631 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
13632 }
13633
13634 if (elf_header.e_shoff)
13635 {
13636 /* There may be some extensions in the first section header. Don't
13637 bomb if we can't read it. */
13638 if (is_32bit_elf)
13639 get_32bit_section_headers (file, 1);
13640 else
13641 get_64bit_section_headers (file, 1);
13642 }
13643
13644 return 1;
13645 }
13646
13647 /* Process one ELF object file according to the command line options.
13648 This file may actually be stored in an archive. The file is
13649 positioned at the start of the ELF object. */
13650
13651 static int
13652 process_object (char * file_name, FILE * file)
13653 {
13654 unsigned int i;
13655
13656 if (! get_file_header (file))
13657 {
13658 error (_("%s: Failed to read file header\n"), file_name);
13659 return 1;
13660 }
13661
13662 /* Initialise per file variables. */
13663 for (i = ARRAY_SIZE (version_info); i--;)
13664 version_info[i] = 0;
13665
13666 for (i = ARRAY_SIZE (dynamic_info); i--;)
13667 dynamic_info[i] = 0;
13668 dynamic_info_DT_GNU_HASH = 0;
13669
13670 /* Process the file. */
13671 if (show_name)
13672 printf (_("\nFile: %s\n"), file_name);
13673
13674 /* Initialise the dump_sects array from the cmdline_dump_sects array.
13675 Note we do this even if cmdline_dump_sects is empty because we
13676 must make sure that the dump_sets array is zeroed out before each
13677 object file is processed. */
13678 if (num_dump_sects > num_cmdline_dump_sects)
13679 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
13680
13681 if (num_cmdline_dump_sects > 0)
13682 {
13683 if (num_dump_sects == 0)
13684 /* A sneaky way of allocating the dump_sects array. */
13685 request_dump_bynumber (num_cmdline_dump_sects, 0);
13686
13687 assert (num_dump_sects >= num_cmdline_dump_sects);
13688 memcpy (dump_sects, cmdline_dump_sects,
13689 num_cmdline_dump_sects * sizeof (* dump_sects));
13690 }
13691
13692 if (! process_file_header ())
13693 return 1;
13694
13695 if (! process_section_headers (file))
13696 {
13697 /* Without loaded section headers we cannot process lots of
13698 things. */
13699 do_unwind = do_version = do_dump = do_arch = 0;
13700
13701 if (! do_using_dynamic)
13702 do_syms = do_dyn_syms = do_reloc = 0;
13703 }
13704
13705 if (! process_section_groups (file))
13706 {
13707 /* Without loaded section groups we cannot process unwind. */
13708 do_unwind = 0;
13709 }
13710
13711 if (process_program_headers (file))
13712 process_dynamic_section (file);
13713
13714 process_relocs (file);
13715
13716 process_unwind (file);
13717
13718 process_symbol_table (file);
13719
13720 process_syminfo (file);
13721
13722 process_version_sections (file);
13723
13724 process_section_contents (file);
13725
13726 process_notes (file);
13727
13728 process_gnu_liblist (file);
13729
13730 process_arch_specific (file);
13731
13732 if (program_headers)
13733 {
13734 free (program_headers);
13735 program_headers = NULL;
13736 }
13737
13738 if (section_headers)
13739 {
13740 free (section_headers);
13741 section_headers = NULL;
13742 }
13743
13744 if (string_table)
13745 {
13746 free (string_table);
13747 string_table = NULL;
13748 string_table_length = 0;
13749 }
13750
13751 if (dynamic_strings)
13752 {
13753 free (dynamic_strings);
13754 dynamic_strings = NULL;
13755 dynamic_strings_length = 0;
13756 }
13757
13758 if (dynamic_symbols)
13759 {
13760 free (dynamic_symbols);
13761 dynamic_symbols = NULL;
13762 num_dynamic_syms = 0;
13763 }
13764
13765 if (dynamic_syminfo)
13766 {
13767 free (dynamic_syminfo);
13768 dynamic_syminfo = NULL;
13769 }
13770
13771 if (dynamic_section)
13772 {
13773 free (dynamic_section);
13774 dynamic_section = NULL;
13775 }
13776
13777 if (section_headers_groups)
13778 {
13779 free (section_headers_groups);
13780 section_headers_groups = NULL;
13781 }
13782
13783 if (section_groups)
13784 {
13785 struct group_list * g;
13786 struct group_list * next;
13787
13788 for (i = 0; i < group_count; i++)
13789 {
13790 for (g = section_groups [i].root; g != NULL; g = next)
13791 {
13792 next = g->next;
13793 free (g);
13794 }
13795 }
13796
13797 free (section_groups);
13798 section_groups = NULL;
13799 }
13800
13801 free_debug_memory ();
13802
13803 return 0;
13804 }
13805
13806 /* Process an ELF archive.
13807 On entry the file is positioned just after the ARMAG string. */
13808
13809 static int
13810 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
13811 {
13812 struct archive_info arch;
13813 struct archive_info nested_arch;
13814 size_t got;
13815 int ret;
13816
13817 show_name = 1;
13818
13819 /* The ARCH structure is used to hold information about this archive. */
13820 arch.file_name = NULL;
13821 arch.file = NULL;
13822 arch.index_array = NULL;
13823 arch.sym_table = NULL;
13824 arch.longnames = NULL;
13825
13826 /* The NESTED_ARCH structure is used as a single-item cache of information
13827 about a nested archive (when members of a thin archive reside within
13828 another regular archive file). */
13829 nested_arch.file_name = NULL;
13830 nested_arch.file = NULL;
13831 nested_arch.index_array = NULL;
13832 nested_arch.sym_table = NULL;
13833 nested_arch.longnames = NULL;
13834
13835 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
13836 {
13837 ret = 1;
13838 goto out;
13839 }
13840
13841 if (do_archive_index)
13842 {
13843 if (arch.sym_table == NULL)
13844 error (_("%s: unable to dump the index as none was found\n"), file_name);
13845 else
13846 {
13847 unsigned int i, l;
13848 unsigned long current_pos;
13849
13850 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
13851 file_name, (long) arch.index_num, arch.sym_size);
13852 current_pos = ftell (file);
13853
13854 for (i = l = 0; i < arch.index_num; i++)
13855 {
13856 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
13857 {
13858 char * member_name;
13859
13860 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
13861
13862 if (member_name != NULL)
13863 {
13864 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
13865
13866 if (qualified_name != NULL)
13867 {
13868 printf (_("Contents of binary %s at offset "), qualified_name);
13869 (void) print_vma (arch.index_array[i], PREFIX_HEX);
13870 putchar ('\n');
13871 free (qualified_name);
13872 }
13873 }
13874 }
13875
13876 if (l >= arch.sym_size)
13877 {
13878 error (_("%s: end of the symbol table reached before the end of the index\n"),
13879 file_name);
13880 break;
13881 }
13882 printf ("\t%s\n", arch.sym_table + l);
13883 l += strlen (arch.sym_table + l) + 1;
13884 }
13885
13886 if (arch.uses_64bit_indicies)
13887 l = (l + 7) & ~ 7;
13888 else
13889 l += l & 1;
13890
13891 if (l < arch.sym_size)
13892 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
13893 file_name, arch.sym_size - l);
13894
13895 if (fseek (file, current_pos, SEEK_SET) != 0)
13896 {
13897 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
13898 ret = 1;
13899 goto out;
13900 }
13901 }
13902
13903 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
13904 && !do_segments && !do_header && !do_dump && !do_version
13905 && !do_histogram && !do_debugging && !do_arch && !do_notes
13906 && !do_section_groups && !do_dyn_syms)
13907 {
13908 ret = 0; /* Archive index only. */
13909 goto out;
13910 }
13911 }
13912
13913 ret = 0;
13914
13915 while (1)
13916 {
13917 char * name;
13918 size_t namelen;
13919 char * qualified_name;
13920
13921 /* Read the next archive header. */
13922 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13923 {
13924 error (_("%s: failed to seek to next archive header\n"), file_name);
13925 return 1;
13926 }
13927 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13928 if (got != sizeof arch.arhdr)
13929 {
13930 if (got == 0)
13931 break;
13932 error (_("%s: failed to read archive header\n"), file_name);
13933 ret = 1;
13934 break;
13935 }
13936 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13937 {
13938 error (_("%s: did not find a valid archive header\n"), arch.file_name);
13939 ret = 1;
13940 break;
13941 }
13942
13943 arch.next_arhdr_offset += sizeof arch.arhdr;
13944
13945 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13946 if (archive_file_size & 01)
13947 ++archive_file_size;
13948
13949 name = get_archive_member_name (&arch, &nested_arch);
13950 if (name == NULL)
13951 {
13952 error (_("%s: bad archive file name\n"), file_name);
13953 ret = 1;
13954 break;
13955 }
13956 namelen = strlen (name);
13957
13958 qualified_name = make_qualified_name (&arch, &nested_arch, name);
13959 if (qualified_name == NULL)
13960 {
13961 error (_("%s: bad archive file name\n"), file_name);
13962 ret = 1;
13963 break;
13964 }
13965
13966 if (is_thin_archive && arch.nested_member_origin == 0)
13967 {
13968 /* This is a proxy for an external member of a thin archive. */
13969 FILE * member_file;
13970 char * member_file_name = adjust_relative_path (file_name, name, namelen);
13971 if (member_file_name == NULL)
13972 {
13973 ret = 1;
13974 break;
13975 }
13976
13977 member_file = fopen (member_file_name, "rb");
13978 if (member_file == NULL)
13979 {
13980 error (_("Input file '%s' is not readable.\n"), member_file_name);
13981 free (member_file_name);
13982 ret = 1;
13983 break;
13984 }
13985
13986 archive_file_offset = arch.nested_member_origin;
13987
13988 ret |= process_object (qualified_name, member_file);
13989
13990 fclose (member_file);
13991 free (member_file_name);
13992 }
13993 else if (is_thin_archive)
13994 {
13995 /* PR 15140: Allow for corrupt thin archives. */
13996 if (nested_arch.file == NULL)
13997 {
13998 error (_("%s: contains corrupt thin archive: %s\n"),
13999 file_name, name);
14000 ret = 1;
14001 break;
14002 }
14003
14004 /* This is a proxy for a member of a nested archive. */
14005 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14006
14007 /* The nested archive file will have been opened and setup by
14008 get_archive_member_name. */
14009 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14010 {
14011 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14012 ret = 1;
14013 break;
14014 }
14015
14016 ret |= process_object (qualified_name, nested_arch.file);
14017 }
14018 else
14019 {
14020 archive_file_offset = arch.next_arhdr_offset;
14021 arch.next_arhdr_offset += archive_file_size;
14022
14023 ret |= process_object (qualified_name, file);
14024 }
14025
14026 if (dump_sects != NULL)
14027 {
14028 free (dump_sects);
14029 dump_sects = NULL;
14030 num_dump_sects = 0;
14031 }
14032
14033 free (qualified_name);
14034 }
14035
14036 out:
14037 if (nested_arch.file != NULL)
14038 fclose (nested_arch.file);
14039 release_archive (&nested_arch);
14040 release_archive (&arch);
14041
14042 return ret;
14043 }
14044
14045 static int
14046 process_file (char * file_name)
14047 {
14048 FILE * file;
14049 struct stat statbuf;
14050 char armag[SARMAG];
14051 int ret;
14052
14053 if (stat (file_name, &statbuf) < 0)
14054 {
14055 if (errno == ENOENT)
14056 error (_("'%s': No such file\n"), file_name);
14057 else
14058 error (_("Could not locate '%s'. System error message: %s\n"),
14059 file_name, strerror (errno));
14060 return 1;
14061 }
14062
14063 if (! S_ISREG (statbuf.st_mode))
14064 {
14065 error (_("'%s' is not an ordinary file\n"), file_name);
14066 return 1;
14067 }
14068
14069 file = fopen (file_name, "rb");
14070 if (file == NULL)
14071 {
14072 error (_("Input file '%s' is not readable.\n"), file_name);
14073 return 1;
14074 }
14075
14076 if (fread (armag, SARMAG, 1, file) != 1)
14077 {
14078 error (_("%s: Failed to read file's magic number\n"), file_name);
14079 fclose (file);
14080 return 1;
14081 }
14082
14083 if (memcmp (armag, ARMAG, SARMAG) == 0)
14084 ret = process_archive (file_name, file, FALSE);
14085 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
14086 ret = process_archive (file_name, file, TRUE);
14087 else
14088 {
14089 if (do_archive_index)
14090 error (_("File %s is not an archive so its index cannot be displayed.\n"),
14091 file_name);
14092
14093 rewind (file);
14094 archive_file_size = archive_file_offset = 0;
14095 ret = process_object (file_name, file);
14096 }
14097
14098 fclose (file);
14099
14100 return ret;
14101 }
14102
14103 #ifdef SUPPORT_DISASSEMBLY
14104 /* Needed by the i386 disassembler. For extra credit, someone could
14105 fix this so that we insert symbolic addresses here, esp for GOT/PLT
14106 symbols. */
14107
14108 void
14109 print_address (unsigned int addr, FILE * outfile)
14110 {
14111 fprintf (outfile,"0x%8.8x", addr);
14112 }
14113
14114 /* Needed by the i386 disassembler. */
14115 void
14116 db_task_printsym (unsigned int addr)
14117 {
14118 print_address (addr, stderr);
14119 }
14120 #endif
14121
14122 int
14123 main (int argc, char ** argv)
14124 {
14125 int err;
14126
14127 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
14128 setlocale (LC_MESSAGES, "");
14129 #endif
14130 #if defined (HAVE_SETLOCALE)
14131 setlocale (LC_CTYPE, "");
14132 #endif
14133 bindtextdomain (PACKAGE, LOCALEDIR);
14134 textdomain (PACKAGE);
14135
14136 expandargv (&argc, &argv);
14137
14138 parse_args (argc, argv);
14139
14140 if (num_dump_sects > 0)
14141 {
14142 /* Make a copy of the dump_sects array. */
14143 cmdline_dump_sects = (dump_type *)
14144 malloc (num_dump_sects * sizeof (* dump_sects));
14145 if (cmdline_dump_sects == NULL)
14146 error (_("Out of memory allocating dump request table.\n"));
14147 else
14148 {
14149 memcpy (cmdline_dump_sects, dump_sects,
14150 num_dump_sects * sizeof (* dump_sects));
14151 num_cmdline_dump_sects = num_dump_sects;
14152 }
14153 }
14154
14155 if (optind < (argc - 1))
14156 show_name = 1;
14157
14158 err = 0;
14159 while (optind < argc)
14160 err |= process_file (argv[optind++]);
14161
14162 if (dump_sects != NULL)
14163 free (dump_sects);
14164 if (cmdline_dump_sects != NULL)
14165 free (cmdline_dump_sects);
14166
14167 return err;
14168 }
This page took 0.315707 seconds and 5 git commands to generate.