PR binutils/12058
[deliverable/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009, 2010
4 Free Software Foundation, Inc.
5
6 Originally developed by Eric Youngdale <eric@andante.jic.com>
7 Modifications by Nick Clifton <nickc@redhat.com>
8
9 This file is part of GNU Binutils.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 02110-1301, USA. */
25 \f
26 /* The difference between readelf and objdump:
27
28 Both programs are capable of displaying the contents of ELF format files,
29 so why does the binutils project have two file dumpers ?
30
31 The reason is that objdump sees an ELF file through a BFD filter of the
32 world; if BFD has a bug where, say, it disagrees about a machine constant
33 in e_flags, then the odds are good that it will remain internally
34 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
35 GAS sees it the BFD way. There was need for a tool to go find out what
36 the file actually says.
37
38 This is why the readelf program does not link against the BFD library - it
39 exists as an independent program to help verify the correct working of BFD.
40
41 There is also the case that readelf can provide more information about an
42 ELF file than is provided by objdump. In particular it can display DWARF
43 debugging information which (at the moment) objdump cannot. */
44 \f
45 #include "config.h"
46 #include "sysdep.h"
47 #include <assert.h>
48 #include <sys/stat.h>
49 #include <time.h>
50 #ifdef HAVE_ZLIB_H
51 #include <zlib.h>
52 #endif
53
54 #if __GNUC__ >= 2
55 /* Define BFD64 here, even if our default architecture is 32 bit ELF
56 as this will allow us to read in and parse 64bit and 32bit ELF files.
57 Only do this if we believe that the compiler can support a 64 bit
58 data type. For now we only rely on GCC being able to do this. */
59 #define BFD64
60 #endif
61
62 #include "bfd.h"
63 #include "bucomm.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/alpha.h"
95 #include "elf/arc.h"
96 #include "elf/arm.h"
97 #include "elf/avr.h"
98 #include "elf/bfin.h"
99 #include "elf/cr16.h"
100 #include "elf/cris.h"
101 #include "elf/crx.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
104 #include "elf/dlx.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/h8.h"
108 #include "elf/hppa.h"
109 #include "elf/i386.h"
110 #include "elf/i370.h"
111 #include "elf/i860.h"
112 #include "elf/i960.h"
113 #include "elf/ia64.h"
114 #include "elf/ip2k.h"
115 #include "elf/lm32.h"
116 #include "elf/iq2000.h"
117 #include "elf/m32c.h"
118 #include "elf/m32r.h"
119 #include "elf/m68k.h"
120 #include "elf/m68hc11.h"
121 #include "elf/mcore.h"
122 #include "elf/mep.h"
123 #include "elf/microblaze.h"
124 #include "elf/mips.h"
125 #include "elf/mmix.h"
126 #include "elf/mn10200.h"
127 #include "elf/mn10300.h"
128 #include "elf/moxie.h"
129 #include "elf/mt.h"
130 #include "elf/msp430.h"
131 #include "elf/or32.h"
132 #include "elf/pj.h"
133 #include "elf/ppc.h"
134 #include "elf/ppc64.h"
135 #include "elf/rx.h"
136 #include "elf/s390.h"
137 #include "elf/score.h"
138 #include "elf/sh.h"
139 #include "elf/sparc.h"
140 #include "elf/spu.h"
141 #include "elf/tic6x.h"
142 #include "elf/v850.h"
143 #include "elf/vax.h"
144 #include "elf/x86-64.h"
145 #include "elf/xc16x.h"
146 #include "elf/xstormy16.h"
147 #include "elf/xtensa.h"
148
149 #include "aout/ar.h"
150
151 #include "getopt.h"
152 #include "libiberty.h"
153 #include "safe-ctype.h"
154 #include "filenames.h"
155
156 char * program_name = "readelf";
157 static long archive_file_offset;
158 static unsigned long archive_file_size;
159 static unsigned long dynamic_addr;
160 static bfd_size_type dynamic_size;
161 static unsigned int dynamic_nent;
162 static char * dynamic_strings;
163 static unsigned long dynamic_strings_length;
164 static char * string_table;
165 static unsigned long string_table_length;
166 static unsigned long num_dynamic_syms;
167 static Elf_Internal_Sym * dynamic_symbols;
168 static Elf_Internal_Syminfo * dynamic_syminfo;
169 static unsigned long dynamic_syminfo_offset;
170 static unsigned int dynamic_syminfo_nent;
171 static char program_interpreter[PATH_MAX];
172 static bfd_vma dynamic_info[DT_ENCODING];
173 static bfd_vma dynamic_info_DT_GNU_HASH;
174 static bfd_vma version_info[16];
175 static Elf_Internal_Ehdr elf_header;
176 static Elf_Internal_Shdr * section_headers;
177 static Elf_Internal_Phdr * program_headers;
178 static Elf_Internal_Dyn * dynamic_section;
179 static Elf_Internal_Shdr * symtab_shndx_hdr;
180 static int show_name;
181 static int do_dynamic;
182 static int do_syms;
183 static int do_dyn_syms;
184 static int do_reloc;
185 static int do_sections;
186 static int do_section_groups;
187 static int do_section_details;
188 static int do_segments;
189 static int do_unwind;
190 static int do_using_dynamic;
191 static int do_header;
192 static int do_dump;
193 static int do_version;
194 static int do_histogram;
195 static int do_debugging;
196 static int do_arch;
197 static int do_notes;
198 static int do_archive_index;
199 static int is_32bit_elf;
200
201 struct group_list
202 {
203 struct group_list * next;
204 unsigned int section_index;
205 };
206
207 struct group
208 {
209 struct group_list * root;
210 unsigned int group_index;
211 };
212
213 static size_t group_count;
214 static struct group * section_groups;
215 static struct group ** section_headers_groups;
216
217
218 /* Flag bits indicating particular types of dump. */
219 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
220 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
221 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
222 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
223 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
224
225 typedef unsigned char dump_type;
226
227 /* A linked list of the section names for which dumps were requested. */
228 struct dump_list_entry
229 {
230 char * name;
231 dump_type type;
232 struct dump_list_entry * next;
233 };
234 static struct dump_list_entry * dump_sects_byname;
235
236 /* A dynamic array of flags indicating for which sections a dump
237 has been requested via command line switches. */
238 static dump_type * cmdline_dump_sects = NULL;
239 static unsigned int num_cmdline_dump_sects = 0;
240
241 /* A dynamic array of flags indicating for which sections a dump of
242 some kind has been requested. It is reset on a per-object file
243 basis and then initialised from the cmdline_dump_sects array,
244 the results of interpreting the -w switch, and the
245 dump_sects_byname list. */
246 static dump_type * dump_sects = NULL;
247 static unsigned int num_dump_sects = 0;
248
249
250 /* How to print a vma value. */
251 typedef enum print_mode
252 {
253 HEX,
254 DEC,
255 DEC_5,
256 UNSIGNED,
257 PREFIX_HEX,
258 FULL_HEX,
259 LONG_HEX
260 }
261 print_mode;
262
263 static void (* byte_put) (unsigned char *, bfd_vma, int);
264
265 #define UNKNOWN -1
266
267 #define SECTION_NAME(X) \
268 ((X) == NULL ? _("<none>") \
269 : string_table == NULL ? _("<no-name>") \
270 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
271 : string_table + (X)->sh_name))
272
273 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
274
275 #define BYTE_GET(field) byte_get (field, sizeof (field))
276 #define BYTE_GET_SIGNED(field) byte_get_signed (field, sizeof (field))
277
278 #define GET_ELF_SYMBOLS(file, section) \
279 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
280 : get_64bit_elf_symbols (file, section))
281
282 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
283 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
284 already been called and verified that the string exists. */
285 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
286
287 /* This is just a bit of syntatic sugar. */
288 #define streq(a,b) (strcmp ((a), (b)) == 0)
289 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
290 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
291
292 #define REMOVE_ARCH_BITS(ADDR) do { \
293 if (elf_header.e_machine == EM_ARM) \
294 (ADDR) &= ~1; \
295 } while (0)
296 \f
297 static void *
298 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
299 const char * reason)
300 {
301 void * mvar;
302
303 if (size == 0 || nmemb == 0)
304 return NULL;
305
306 if (fseek (file, archive_file_offset + offset, SEEK_SET))
307 {
308 error (_("Unable to seek to 0x%lx for %s\n"),
309 (unsigned long) archive_file_offset + offset, reason);
310 return NULL;
311 }
312
313 mvar = var;
314 if (mvar == NULL)
315 {
316 /* Check for overflow. */
317 if (nmemb < (~(size_t) 0 - 1) / size)
318 /* + 1 so that we can '\0' terminate invalid string table sections. */
319 mvar = malloc (size * nmemb + 1);
320
321 if (mvar == NULL)
322 {
323 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
324 (unsigned long)(size * nmemb), reason);
325 return NULL;
326 }
327
328 ((char *) mvar)[size * nmemb] = '\0';
329 }
330
331 if (fread (mvar, size, nmemb, file) != nmemb)
332 {
333 error (_("Unable to read in 0x%lx bytes of %s\n"),
334 (unsigned long)(size * nmemb), reason);
335 if (mvar != var)
336 free (mvar);
337 return NULL;
338 }
339
340 return mvar;
341 }
342
343 static void
344 byte_put_little_endian (unsigned char * field, bfd_vma value, int size)
345 {
346 switch (size)
347 {
348 case 8:
349 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
350 field[6] = ((value >> 24) >> 24) & 0xff;
351 field[5] = ((value >> 24) >> 16) & 0xff;
352 field[4] = ((value >> 24) >> 8) & 0xff;
353 /* Fall through. */
354 case 4:
355 field[3] = (value >> 24) & 0xff;
356 /* Fall through. */
357 case 3:
358 field[2] = (value >> 16) & 0xff;
359 /* Fall through. */
360 case 2:
361 field[1] = (value >> 8) & 0xff;
362 /* Fall through. */
363 case 1:
364 field[0] = value & 0xff;
365 break;
366
367 default:
368 error (_("Unhandled data length: %d\n"), size);
369 abort ();
370 }
371 }
372
373 /* Print a VMA value. */
374
375 static int
376 print_vma (bfd_vma vma, print_mode mode)
377 {
378 int nc = 0;
379
380 switch (mode)
381 {
382 case FULL_HEX:
383 nc = printf ("0x");
384 /* Drop through. */
385
386 case LONG_HEX:
387 #ifdef BFD64
388 if (is_32bit_elf)
389 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
390 #endif
391 printf_vma (vma);
392 return nc + 16;
393
394 case DEC_5:
395 if (vma <= 99999)
396 return printf ("%5" BFD_VMA_FMT "d", vma);
397 /* Drop through. */
398
399 case PREFIX_HEX:
400 nc = printf ("0x");
401 /* Drop through. */
402
403 case HEX:
404 return nc + printf ("%" BFD_VMA_FMT "x", vma);
405
406 case DEC:
407 return printf ("%" BFD_VMA_FMT "d", vma);
408
409 case UNSIGNED:
410 return printf ("%" BFD_VMA_FMT "u", vma);
411 }
412 return 0;
413 }
414
415 /* Display a symbol on stdout. Handles the display of non-printing characters.
416
417 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
418 truncating as necessary. If WIDTH is negative then format the string to be
419 exactly - WIDTH characters, truncating or padding as necessary.
420
421 Returns the number of emitted characters. */
422
423 static unsigned int
424 print_symbol (int width, const char * symbol)
425 {
426 const char * c;
427 bfd_boolean extra_padding = FALSE;
428 unsigned int num_printed = 0;
429
430 if (do_wide)
431 {
432 /* Set the width to a very large value. This simplifies the code below. */
433 width = INT_MAX;
434 }
435 else if (width < 0)
436 {
437 /* Keep the width positive. This also helps. */
438 width = - width;
439 extra_padding = TRUE;
440 }
441
442 while (width)
443 {
444 int len;
445
446 c = symbol;
447
448 /* Look for non-printing symbols inside the symbol's name.
449 This test is triggered in particular by the names generated
450 by the assembler for local labels. */
451 while (ISPRINT (* c))
452 c++;
453
454 len = c - symbol;
455
456 if (len)
457 {
458 if (len > width)
459 len = width;
460
461 printf ("%.*s", len, symbol);
462
463 width -= len;
464 num_printed += len;
465 }
466
467 if (* c == 0 || width == 0)
468 break;
469
470 /* Now display the non-printing character, if
471 there is room left in which to dipslay it. */
472 if (*c < 32)
473 {
474 if (width < 2)
475 break;
476
477 printf ("^%c", *c + 0x40);
478
479 width -= 2;
480 num_printed += 2;
481 }
482 else
483 {
484 if (width < 6)
485 break;
486
487 printf ("<0x%.2x>", *c);
488
489 width -= 6;
490 num_printed += 6;
491 }
492
493 symbol = c + 1;
494 }
495
496 if (extra_padding && width > 0)
497 {
498 /* Fill in the remaining spaces. */
499 printf ("%-*s", width, " ");
500 num_printed += 2;
501 }
502
503 return num_printed;
504 }
505
506 static void
507 byte_put_big_endian (unsigned char * field, bfd_vma value, int size)
508 {
509 switch (size)
510 {
511 case 8:
512 field[7] = value & 0xff;
513 field[6] = (value >> 8) & 0xff;
514 field[5] = (value >> 16) & 0xff;
515 field[4] = (value >> 24) & 0xff;
516 value >>= 16;
517 value >>= 16;
518 /* Fall through. */
519 case 4:
520 field[3] = value & 0xff;
521 value >>= 8;
522 /* Fall through. */
523 case 3:
524 field[2] = value & 0xff;
525 value >>= 8;
526 /* Fall through. */
527 case 2:
528 field[1] = value & 0xff;
529 value >>= 8;
530 /* Fall through. */
531 case 1:
532 field[0] = value & 0xff;
533 break;
534
535 default:
536 error (_("Unhandled data length: %d\n"), size);
537 abort ();
538 }
539 }
540
541 /* Return a pointer to section NAME, or NULL if no such section exists. */
542
543 static Elf_Internal_Shdr *
544 find_section (const char * name)
545 {
546 unsigned int i;
547
548 for (i = 0; i < elf_header.e_shnum; i++)
549 if (streq (SECTION_NAME (section_headers + i), name))
550 return section_headers + i;
551
552 return NULL;
553 }
554
555 /* Return a pointer to a section containing ADDR, or NULL if no such
556 section exists. */
557
558 static Elf_Internal_Shdr *
559 find_section_by_address (bfd_vma addr)
560 {
561 unsigned int i;
562
563 for (i = 0; i < elf_header.e_shnum; i++)
564 {
565 Elf_Internal_Shdr *sec = section_headers + i;
566 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
567 return sec;
568 }
569
570 return NULL;
571 }
572
573 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
574 bytes read. */
575
576 static unsigned long
577 read_uleb128 (unsigned char *data, unsigned int *length_return)
578 {
579 return read_leb128 (data, length_return, 0);
580 }
581
582 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
583 This OS has so many departures from the ELF standard that we test it at
584 many places. */
585
586 static inline int
587 is_ia64_vms (void)
588 {
589 return elf_header.e_machine == EM_IA_64
590 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
591 }
592
593 /* Guess the relocation size commonly used by the specific machines. */
594
595 static int
596 guess_is_rela (unsigned int e_machine)
597 {
598 switch (e_machine)
599 {
600 /* Targets that use REL relocations. */
601 case EM_386:
602 case EM_486:
603 case EM_960:
604 case EM_ARM:
605 case EM_D10V:
606 case EM_CYGNUS_D10V:
607 case EM_DLX:
608 case EM_MIPS:
609 case EM_MIPS_RS3_LE:
610 case EM_CYGNUS_M32R:
611 case EM_OPENRISC:
612 case EM_OR32:
613 case EM_SCORE:
614 return FALSE;
615
616 /* Targets that use RELA relocations. */
617 case EM_68K:
618 case EM_860:
619 case EM_ALPHA:
620 case EM_ALTERA_NIOS2:
621 case EM_AVR:
622 case EM_AVR_OLD:
623 case EM_BLACKFIN:
624 case EM_CR16:
625 case EM_CR16_OLD:
626 case EM_CRIS:
627 case EM_CRX:
628 case EM_D30V:
629 case EM_CYGNUS_D30V:
630 case EM_FR30:
631 case EM_CYGNUS_FR30:
632 case EM_CYGNUS_FRV:
633 case EM_H8S:
634 case EM_H8_300:
635 case EM_H8_300H:
636 case EM_IA_64:
637 case EM_IP2K:
638 case EM_IP2K_OLD:
639 case EM_IQ2000:
640 case EM_LATTICEMICO32:
641 case EM_M32C_OLD:
642 case EM_M32C:
643 case EM_M32R:
644 case EM_MCORE:
645 case EM_CYGNUS_MEP:
646 case EM_MMIX:
647 case EM_MN10200:
648 case EM_CYGNUS_MN10200:
649 case EM_MN10300:
650 case EM_CYGNUS_MN10300:
651 case EM_MOXIE:
652 case EM_MSP430:
653 case EM_MSP430_OLD:
654 case EM_MT:
655 case EM_NIOS32:
656 case EM_PPC64:
657 case EM_PPC:
658 case EM_RX:
659 case EM_S390:
660 case EM_S390_OLD:
661 case EM_SH:
662 case EM_SPARC:
663 case EM_SPARC32PLUS:
664 case EM_SPARCV9:
665 case EM_SPU:
666 case EM_TI_C6000:
667 case EM_V850:
668 case EM_CYGNUS_V850:
669 case EM_VAX:
670 case EM_X86_64:
671 case EM_L1OM:
672 case EM_XSTORMY16:
673 case EM_XTENSA:
674 case EM_XTENSA_OLD:
675 case EM_MICROBLAZE:
676 case EM_MICROBLAZE_OLD:
677 return TRUE;
678
679 case EM_68HC05:
680 case EM_68HC08:
681 case EM_68HC11:
682 case EM_68HC16:
683 case EM_FX66:
684 case EM_ME16:
685 case EM_MMA:
686 case EM_NCPU:
687 case EM_NDR1:
688 case EM_PCP:
689 case EM_ST100:
690 case EM_ST19:
691 case EM_ST7:
692 case EM_ST9PLUS:
693 case EM_STARCORE:
694 case EM_SVX:
695 case EM_TINYJ:
696 default:
697 warn (_("Don't know about relocations on this machine architecture\n"));
698 return FALSE;
699 }
700 }
701
702 static int
703 slurp_rela_relocs (FILE * file,
704 unsigned long rel_offset,
705 unsigned long rel_size,
706 Elf_Internal_Rela ** relasp,
707 unsigned long * nrelasp)
708 {
709 Elf_Internal_Rela * relas;
710 unsigned long nrelas;
711 unsigned int i;
712
713 if (is_32bit_elf)
714 {
715 Elf32_External_Rela * erelas;
716
717 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
718 rel_size, _("relocs"));
719 if (!erelas)
720 return 0;
721
722 nrelas = rel_size / sizeof (Elf32_External_Rela);
723
724 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
725 sizeof (Elf_Internal_Rela));
726
727 if (relas == NULL)
728 {
729 free (erelas);
730 error (_("out of memory parsing relocs\n"));
731 return 0;
732 }
733
734 for (i = 0; i < nrelas; i++)
735 {
736 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
737 relas[i].r_info = BYTE_GET (erelas[i].r_info);
738 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
739 }
740
741 free (erelas);
742 }
743 else
744 {
745 Elf64_External_Rela * erelas;
746
747 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
748 rel_size, _("relocs"));
749 if (!erelas)
750 return 0;
751
752 nrelas = rel_size / sizeof (Elf64_External_Rela);
753
754 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
755 sizeof (Elf_Internal_Rela));
756
757 if (relas == NULL)
758 {
759 free (erelas);
760 error (_("out of memory parsing relocs\n"));
761 return 0;
762 }
763
764 for (i = 0; i < nrelas; i++)
765 {
766 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
767 relas[i].r_info = BYTE_GET (erelas[i].r_info);
768 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
769
770 /* The #ifdef BFD64 below is to prevent a compile time
771 warning. We know that if we do not have a 64 bit data
772 type that we will never execute this code anyway. */
773 #ifdef BFD64
774 if (elf_header.e_machine == EM_MIPS
775 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
776 {
777 /* In little-endian objects, r_info isn't really a
778 64-bit little-endian value: it has a 32-bit
779 little-endian symbol index followed by four
780 individual byte fields. Reorder INFO
781 accordingly. */
782 bfd_vma inf = relas[i].r_info;
783 inf = (((inf & 0xffffffff) << 32)
784 | ((inf >> 56) & 0xff)
785 | ((inf >> 40) & 0xff00)
786 | ((inf >> 24) & 0xff0000)
787 | ((inf >> 8) & 0xff000000));
788 relas[i].r_info = inf;
789 }
790 #endif /* BFD64 */
791 }
792
793 free (erelas);
794 }
795 *relasp = relas;
796 *nrelasp = nrelas;
797 return 1;
798 }
799
800 static int
801 slurp_rel_relocs (FILE * file,
802 unsigned long rel_offset,
803 unsigned long rel_size,
804 Elf_Internal_Rela ** relsp,
805 unsigned long * nrelsp)
806 {
807 Elf_Internal_Rela * rels;
808 unsigned long nrels;
809 unsigned int i;
810
811 if (is_32bit_elf)
812 {
813 Elf32_External_Rel * erels;
814
815 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
816 rel_size, _("relocs"));
817 if (!erels)
818 return 0;
819
820 nrels = rel_size / sizeof (Elf32_External_Rel);
821
822 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
823
824 if (rels == NULL)
825 {
826 free (erels);
827 error (_("out of memory parsing relocs\n"));
828 return 0;
829 }
830
831 for (i = 0; i < nrels; i++)
832 {
833 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
834 rels[i].r_info = BYTE_GET (erels[i].r_info);
835 rels[i].r_addend = 0;
836 }
837
838 free (erels);
839 }
840 else
841 {
842 Elf64_External_Rel * erels;
843
844 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
845 rel_size, _("relocs"));
846 if (!erels)
847 return 0;
848
849 nrels = rel_size / sizeof (Elf64_External_Rel);
850
851 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
852
853 if (rels == NULL)
854 {
855 free (erels);
856 error (_("out of memory parsing relocs\n"));
857 return 0;
858 }
859
860 for (i = 0; i < nrels; i++)
861 {
862 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
863 rels[i].r_info = BYTE_GET (erels[i].r_info);
864 rels[i].r_addend = 0;
865
866 /* The #ifdef BFD64 below is to prevent a compile time
867 warning. We know that if we do not have a 64 bit data
868 type that we will never execute this code anyway. */
869 #ifdef BFD64
870 if (elf_header.e_machine == EM_MIPS
871 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
872 {
873 /* In little-endian objects, r_info isn't really a
874 64-bit little-endian value: it has a 32-bit
875 little-endian symbol index followed by four
876 individual byte fields. Reorder INFO
877 accordingly. */
878 bfd_vma inf = rels[i].r_info;
879 inf = (((inf & 0xffffffff) << 32)
880 | ((inf >> 56) & 0xff)
881 | ((inf >> 40) & 0xff00)
882 | ((inf >> 24) & 0xff0000)
883 | ((inf >> 8) & 0xff000000));
884 rels[i].r_info = inf;
885 }
886 #endif /* BFD64 */
887 }
888
889 free (erels);
890 }
891 *relsp = rels;
892 *nrelsp = nrels;
893 return 1;
894 }
895
896 /* Returns the reloc type extracted from the reloc info field. */
897
898 static unsigned int
899 get_reloc_type (bfd_vma reloc_info)
900 {
901 if (is_32bit_elf)
902 return ELF32_R_TYPE (reloc_info);
903
904 switch (elf_header.e_machine)
905 {
906 case EM_MIPS:
907 /* Note: We assume that reloc_info has already been adjusted for us. */
908 return ELF64_MIPS_R_TYPE (reloc_info);
909
910 case EM_SPARCV9:
911 return ELF64_R_TYPE_ID (reloc_info);
912
913 default:
914 return ELF64_R_TYPE (reloc_info);
915 }
916 }
917
918 /* Return the symbol index extracted from the reloc info field. */
919
920 static bfd_vma
921 get_reloc_symindex (bfd_vma reloc_info)
922 {
923 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
924 }
925
926 /* Display the contents of the relocation data found at the specified
927 offset. */
928
929 static void
930 dump_relocations (FILE * file,
931 unsigned long rel_offset,
932 unsigned long rel_size,
933 Elf_Internal_Sym * symtab,
934 unsigned long nsyms,
935 char * strtab,
936 unsigned long strtablen,
937 int is_rela)
938 {
939 unsigned int i;
940 Elf_Internal_Rela * rels;
941
942 if (is_rela == UNKNOWN)
943 is_rela = guess_is_rela (elf_header.e_machine);
944
945 if (is_rela)
946 {
947 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
948 return;
949 }
950 else
951 {
952 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
953 return;
954 }
955
956 if (is_32bit_elf)
957 {
958 if (is_rela)
959 {
960 if (do_wide)
961 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
962 else
963 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
964 }
965 else
966 {
967 if (do_wide)
968 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
969 else
970 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
971 }
972 }
973 else
974 {
975 if (is_rela)
976 {
977 if (do_wide)
978 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
979 else
980 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
981 }
982 else
983 {
984 if (do_wide)
985 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
986 else
987 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
988 }
989 }
990
991 for (i = 0; i < rel_size; i++)
992 {
993 const char * rtype;
994 bfd_vma offset;
995 bfd_vma inf;
996 bfd_vma symtab_index;
997 bfd_vma type;
998
999 offset = rels[i].r_offset;
1000 inf = rels[i].r_info;
1001
1002 type = get_reloc_type (inf);
1003 symtab_index = get_reloc_symindex (inf);
1004
1005 if (is_32bit_elf)
1006 {
1007 printf ("%8.8lx %8.8lx ",
1008 (unsigned long) offset & 0xffffffff,
1009 (unsigned long) inf & 0xffffffff);
1010 }
1011 else
1012 {
1013 #if BFD_HOST_64BIT_LONG
1014 printf (do_wide
1015 ? "%16.16lx %16.16lx "
1016 : "%12.12lx %12.12lx ",
1017 offset, inf);
1018 #elif BFD_HOST_64BIT_LONG_LONG
1019 #ifndef __MSVCRT__
1020 printf (do_wide
1021 ? "%16.16llx %16.16llx "
1022 : "%12.12llx %12.12llx ",
1023 offset, inf);
1024 #else
1025 printf (do_wide
1026 ? "%16.16I64x %16.16I64x "
1027 : "%12.12I64x %12.12I64x ",
1028 offset, inf);
1029 #endif
1030 #else
1031 printf (do_wide
1032 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1033 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1034 _bfd_int64_high (offset),
1035 _bfd_int64_low (offset),
1036 _bfd_int64_high (inf),
1037 _bfd_int64_low (inf));
1038 #endif
1039 }
1040
1041 switch (elf_header.e_machine)
1042 {
1043 default:
1044 rtype = NULL;
1045 break;
1046
1047 case EM_M32R:
1048 case EM_CYGNUS_M32R:
1049 rtype = elf_m32r_reloc_type (type);
1050 break;
1051
1052 case EM_386:
1053 case EM_486:
1054 rtype = elf_i386_reloc_type (type);
1055 break;
1056
1057 case EM_68HC11:
1058 case EM_68HC12:
1059 rtype = elf_m68hc11_reloc_type (type);
1060 break;
1061
1062 case EM_68K:
1063 rtype = elf_m68k_reloc_type (type);
1064 break;
1065
1066 case EM_960:
1067 rtype = elf_i960_reloc_type (type);
1068 break;
1069
1070 case EM_AVR:
1071 case EM_AVR_OLD:
1072 rtype = elf_avr_reloc_type (type);
1073 break;
1074
1075 case EM_OLD_SPARCV9:
1076 case EM_SPARC32PLUS:
1077 case EM_SPARCV9:
1078 case EM_SPARC:
1079 rtype = elf_sparc_reloc_type (type);
1080 break;
1081
1082 case EM_SPU:
1083 rtype = elf_spu_reloc_type (type);
1084 break;
1085
1086 case EM_V850:
1087 case EM_CYGNUS_V850:
1088 rtype = v850_reloc_type (type);
1089 break;
1090
1091 case EM_D10V:
1092 case EM_CYGNUS_D10V:
1093 rtype = elf_d10v_reloc_type (type);
1094 break;
1095
1096 case EM_D30V:
1097 case EM_CYGNUS_D30V:
1098 rtype = elf_d30v_reloc_type (type);
1099 break;
1100
1101 case EM_DLX:
1102 rtype = elf_dlx_reloc_type (type);
1103 break;
1104
1105 case EM_SH:
1106 rtype = elf_sh_reloc_type (type);
1107 break;
1108
1109 case EM_MN10300:
1110 case EM_CYGNUS_MN10300:
1111 rtype = elf_mn10300_reloc_type (type);
1112 break;
1113
1114 case EM_MN10200:
1115 case EM_CYGNUS_MN10200:
1116 rtype = elf_mn10200_reloc_type (type);
1117 break;
1118
1119 case EM_FR30:
1120 case EM_CYGNUS_FR30:
1121 rtype = elf_fr30_reloc_type (type);
1122 break;
1123
1124 case EM_CYGNUS_FRV:
1125 rtype = elf_frv_reloc_type (type);
1126 break;
1127
1128 case EM_MCORE:
1129 rtype = elf_mcore_reloc_type (type);
1130 break;
1131
1132 case EM_MMIX:
1133 rtype = elf_mmix_reloc_type (type);
1134 break;
1135
1136 case EM_MOXIE:
1137 rtype = elf_moxie_reloc_type (type);
1138 break;
1139
1140 case EM_MSP430:
1141 case EM_MSP430_OLD:
1142 rtype = elf_msp430_reloc_type (type);
1143 break;
1144
1145 case EM_PPC:
1146 rtype = elf_ppc_reloc_type (type);
1147 break;
1148
1149 case EM_PPC64:
1150 rtype = elf_ppc64_reloc_type (type);
1151 break;
1152
1153 case EM_MIPS:
1154 case EM_MIPS_RS3_LE:
1155 rtype = elf_mips_reloc_type (type);
1156 break;
1157
1158 case EM_ALPHA:
1159 rtype = elf_alpha_reloc_type (type);
1160 break;
1161
1162 case EM_ARM:
1163 rtype = elf_arm_reloc_type (type);
1164 break;
1165
1166 case EM_ARC:
1167 rtype = elf_arc_reloc_type (type);
1168 break;
1169
1170 case EM_PARISC:
1171 rtype = elf_hppa_reloc_type (type);
1172 break;
1173
1174 case EM_H8_300:
1175 case EM_H8_300H:
1176 case EM_H8S:
1177 rtype = elf_h8_reloc_type (type);
1178 break;
1179
1180 case EM_OPENRISC:
1181 case EM_OR32:
1182 rtype = elf_or32_reloc_type (type);
1183 break;
1184
1185 case EM_PJ:
1186 case EM_PJ_OLD:
1187 rtype = elf_pj_reloc_type (type);
1188 break;
1189 case EM_IA_64:
1190 rtype = elf_ia64_reloc_type (type);
1191 break;
1192
1193 case EM_CRIS:
1194 rtype = elf_cris_reloc_type (type);
1195 break;
1196
1197 case EM_860:
1198 rtype = elf_i860_reloc_type (type);
1199 break;
1200
1201 case EM_X86_64:
1202 case EM_L1OM:
1203 rtype = elf_x86_64_reloc_type (type);
1204 break;
1205
1206 case EM_S370:
1207 rtype = i370_reloc_type (type);
1208 break;
1209
1210 case EM_S390_OLD:
1211 case EM_S390:
1212 rtype = elf_s390_reloc_type (type);
1213 break;
1214
1215 case EM_SCORE:
1216 rtype = elf_score_reloc_type (type);
1217 break;
1218
1219 case EM_XSTORMY16:
1220 rtype = elf_xstormy16_reloc_type (type);
1221 break;
1222
1223 case EM_CRX:
1224 rtype = elf_crx_reloc_type (type);
1225 break;
1226
1227 case EM_VAX:
1228 rtype = elf_vax_reloc_type (type);
1229 break;
1230
1231 case EM_IP2K:
1232 case EM_IP2K_OLD:
1233 rtype = elf_ip2k_reloc_type (type);
1234 break;
1235
1236 case EM_IQ2000:
1237 rtype = elf_iq2000_reloc_type (type);
1238 break;
1239
1240 case EM_XTENSA_OLD:
1241 case EM_XTENSA:
1242 rtype = elf_xtensa_reloc_type (type);
1243 break;
1244
1245 case EM_LATTICEMICO32:
1246 rtype = elf_lm32_reloc_type (type);
1247 break;
1248
1249 case EM_M32C_OLD:
1250 case EM_M32C:
1251 rtype = elf_m32c_reloc_type (type);
1252 break;
1253
1254 case EM_MT:
1255 rtype = elf_mt_reloc_type (type);
1256 break;
1257
1258 case EM_BLACKFIN:
1259 rtype = elf_bfin_reloc_type (type);
1260 break;
1261
1262 case EM_CYGNUS_MEP:
1263 rtype = elf_mep_reloc_type (type);
1264 break;
1265
1266 case EM_CR16:
1267 case EM_CR16_OLD:
1268 rtype = elf_cr16_reloc_type (type);
1269 break;
1270
1271 case EM_MICROBLAZE:
1272 case EM_MICROBLAZE_OLD:
1273 rtype = elf_microblaze_reloc_type (type);
1274 break;
1275
1276 case EM_RX:
1277 rtype = elf_rx_reloc_type (type);
1278 break;
1279
1280 case EM_XC16X:
1281 case EM_C166:
1282 rtype = elf_xc16x_reloc_type (type);
1283 break;
1284
1285 case EM_TI_C6000:
1286 rtype = elf_tic6x_reloc_type (type);
1287 break;
1288 }
1289
1290 if (rtype == NULL)
1291 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1292 else
1293 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1294
1295 if (elf_header.e_machine == EM_ALPHA
1296 && rtype != NULL
1297 && streq (rtype, "R_ALPHA_LITUSE")
1298 && is_rela)
1299 {
1300 switch (rels[i].r_addend)
1301 {
1302 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1303 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1304 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1305 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1306 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1307 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1308 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1309 default: rtype = NULL;
1310 }
1311 if (rtype)
1312 printf (" (%s)", rtype);
1313 else
1314 {
1315 putchar (' ');
1316 printf (_("<unknown addend: %lx>"),
1317 (unsigned long) rels[i].r_addend);
1318 }
1319 }
1320 else if (symtab_index)
1321 {
1322 if (symtab == NULL || symtab_index >= nsyms)
1323 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1324 else
1325 {
1326 Elf_Internal_Sym * psym;
1327
1328 psym = symtab + symtab_index;
1329
1330 printf (" ");
1331
1332 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1333 {
1334 const char * name;
1335 unsigned int len;
1336 unsigned int width = is_32bit_elf ? 8 : 14;
1337
1338 /* Relocations against GNU_IFUNC symbols do not use the value
1339 of the symbol as the address to relocate against. Instead
1340 they invoke the function named by the symbol and use its
1341 result as the address for relocation.
1342
1343 To indicate this to the user, do not display the value of
1344 the symbol in the "Symbols's Value" field. Instead show
1345 its name followed by () as a hint that the symbol is
1346 invoked. */
1347
1348 if (strtab == NULL
1349 || psym->st_name == 0
1350 || psym->st_name >= strtablen)
1351 name = "??";
1352 else
1353 name = strtab + psym->st_name;
1354
1355 len = print_symbol (width, name);
1356 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1357 }
1358 else
1359 {
1360 print_vma (psym->st_value, LONG_HEX);
1361
1362 printf (is_32bit_elf ? " " : " ");
1363 }
1364
1365 if (psym->st_name == 0)
1366 {
1367 const char * sec_name = "<null>";
1368 char name_buf[40];
1369
1370 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1371 {
1372 if (psym->st_shndx < elf_header.e_shnum)
1373 sec_name
1374 = SECTION_NAME (section_headers + psym->st_shndx);
1375 else if (psym->st_shndx == SHN_ABS)
1376 sec_name = "ABS";
1377 else if (psym->st_shndx == SHN_COMMON)
1378 sec_name = "COMMON";
1379 else if (elf_header.e_machine == EM_MIPS
1380 && psym->st_shndx == SHN_MIPS_SCOMMON)
1381 sec_name = "SCOMMON";
1382 else if (elf_header.e_machine == EM_MIPS
1383 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1384 sec_name = "SUNDEF";
1385 else if ((elf_header.e_machine == EM_X86_64
1386 || elf_header.e_machine == EM_L1OM)
1387 && psym->st_shndx == SHN_X86_64_LCOMMON)
1388 sec_name = "LARGE_COMMON";
1389 else if (elf_header.e_machine == EM_IA_64
1390 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1391 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1392 sec_name = "ANSI_COM";
1393 else if (is_ia64_vms ()
1394 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1395 sec_name = "VMS_SYMVEC";
1396 else
1397 {
1398 sprintf (name_buf, "<section 0x%x>",
1399 (unsigned int) psym->st_shndx);
1400 sec_name = name_buf;
1401 }
1402 }
1403 print_symbol (22, sec_name);
1404 }
1405 else if (strtab == NULL)
1406 printf (_("<string table index: %3ld>"), psym->st_name);
1407 else if (psym->st_name >= strtablen)
1408 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1409 else
1410 print_symbol (22, strtab + psym->st_name);
1411
1412 if (is_rela)
1413 {
1414 bfd_signed_vma off = rels[i].r_addend;
1415
1416 if (off < 0)
1417 printf (" - %" BFD_VMA_FMT "x", - off);
1418 else
1419 printf (" + %" BFD_VMA_FMT "x", off);
1420 }
1421 }
1422 }
1423 else if (is_rela)
1424 {
1425 printf ("%*c", is_32bit_elf ?
1426 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1427 print_vma (rels[i].r_addend, LONG_HEX);
1428 }
1429
1430 if (elf_header.e_machine == EM_SPARCV9
1431 && rtype != NULL
1432 && streq (rtype, "R_SPARC_OLO10"))
1433 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1434
1435 putchar ('\n');
1436
1437 #ifdef BFD64
1438 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1439 {
1440 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1441 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1442 const char * rtype2 = elf_mips_reloc_type (type2);
1443 const char * rtype3 = elf_mips_reloc_type (type3);
1444
1445 printf (" Type2: ");
1446
1447 if (rtype2 == NULL)
1448 printf (_("unrecognized: %-7lx"),
1449 (unsigned long) type2 & 0xffffffff);
1450 else
1451 printf ("%-17.17s", rtype2);
1452
1453 printf ("\n Type3: ");
1454
1455 if (rtype3 == NULL)
1456 printf (_("unrecognized: %-7lx"),
1457 (unsigned long) type3 & 0xffffffff);
1458 else
1459 printf ("%-17.17s", rtype3);
1460
1461 putchar ('\n');
1462 }
1463 #endif /* BFD64 */
1464 }
1465
1466 free (rels);
1467 }
1468
1469 static const char *
1470 get_mips_dynamic_type (unsigned long type)
1471 {
1472 switch (type)
1473 {
1474 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1475 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1476 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1477 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1478 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1479 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1480 case DT_MIPS_MSYM: return "MIPS_MSYM";
1481 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1482 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1483 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1484 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1485 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1486 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1487 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1488 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1489 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1490 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1491 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1492 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1493 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1494 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1495 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1496 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1497 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1498 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1499 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1500 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1501 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1502 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1503 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1504 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1505 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1506 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1507 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1508 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1509 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1510 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1511 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1512 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1513 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1514 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1515 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1516 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1517 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1518 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1519 default:
1520 return NULL;
1521 }
1522 }
1523
1524 static const char *
1525 get_sparc64_dynamic_type (unsigned long type)
1526 {
1527 switch (type)
1528 {
1529 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1530 default:
1531 return NULL;
1532 }
1533 }
1534
1535 static const char *
1536 get_ppc_dynamic_type (unsigned long type)
1537 {
1538 switch (type)
1539 {
1540 case DT_PPC_GOT: return "PPC_GOT";
1541 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1542 default:
1543 return NULL;
1544 }
1545 }
1546
1547 static const char *
1548 get_ppc64_dynamic_type (unsigned long type)
1549 {
1550 switch (type)
1551 {
1552 case DT_PPC64_GLINK: return "PPC64_GLINK";
1553 case DT_PPC64_OPD: return "PPC64_OPD";
1554 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1555 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1556 default:
1557 return NULL;
1558 }
1559 }
1560
1561 static const char *
1562 get_parisc_dynamic_type (unsigned long type)
1563 {
1564 switch (type)
1565 {
1566 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1567 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1568 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1569 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1570 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1571 case DT_HP_PREINIT: return "HP_PREINIT";
1572 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1573 case DT_HP_NEEDED: return "HP_NEEDED";
1574 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1575 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1576 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1577 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1578 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1579 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1580 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1581 case DT_HP_FILTERED: return "HP_FILTERED";
1582 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1583 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1584 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1585 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1586 case DT_PLT: return "PLT";
1587 case DT_PLT_SIZE: return "PLT_SIZE";
1588 case DT_DLT: return "DLT";
1589 case DT_DLT_SIZE: return "DLT_SIZE";
1590 default:
1591 return NULL;
1592 }
1593 }
1594
1595 static const char *
1596 get_ia64_dynamic_type (unsigned long type)
1597 {
1598 switch (type)
1599 {
1600 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1601 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1602 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1603 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1604 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1605 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1606 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1607 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1608 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1609 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1610 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1611 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1612 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1613 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1614 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1615 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1616 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1617 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1618 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1619 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1620 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1621 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1622 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1623 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1624 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1625 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1626 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1627 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1628 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1629 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1630 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1631 default:
1632 return NULL;
1633 }
1634 }
1635
1636 static const char *
1637 get_alpha_dynamic_type (unsigned long type)
1638 {
1639 switch (type)
1640 {
1641 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1642 default:
1643 return NULL;
1644 }
1645 }
1646
1647 static const char *
1648 get_score_dynamic_type (unsigned long type)
1649 {
1650 switch (type)
1651 {
1652 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1653 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1654 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1655 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1656 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1657 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1658 default:
1659 return NULL;
1660 }
1661 }
1662
1663 static const char *
1664 get_tic6x_dynamic_type (unsigned long type)
1665 {
1666 switch (type)
1667 {
1668 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1669 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1670 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1671 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1672 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1673 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1674 default:
1675 return NULL;
1676 }
1677 }
1678
1679 static const char *
1680 get_dynamic_type (unsigned long type)
1681 {
1682 static char buff[64];
1683
1684 switch (type)
1685 {
1686 case DT_NULL: return "NULL";
1687 case DT_NEEDED: return "NEEDED";
1688 case DT_PLTRELSZ: return "PLTRELSZ";
1689 case DT_PLTGOT: return "PLTGOT";
1690 case DT_HASH: return "HASH";
1691 case DT_STRTAB: return "STRTAB";
1692 case DT_SYMTAB: return "SYMTAB";
1693 case DT_RELA: return "RELA";
1694 case DT_RELASZ: return "RELASZ";
1695 case DT_RELAENT: return "RELAENT";
1696 case DT_STRSZ: return "STRSZ";
1697 case DT_SYMENT: return "SYMENT";
1698 case DT_INIT: return "INIT";
1699 case DT_FINI: return "FINI";
1700 case DT_SONAME: return "SONAME";
1701 case DT_RPATH: return "RPATH";
1702 case DT_SYMBOLIC: return "SYMBOLIC";
1703 case DT_REL: return "REL";
1704 case DT_RELSZ: return "RELSZ";
1705 case DT_RELENT: return "RELENT";
1706 case DT_PLTREL: return "PLTREL";
1707 case DT_DEBUG: return "DEBUG";
1708 case DT_TEXTREL: return "TEXTREL";
1709 case DT_JMPREL: return "JMPREL";
1710 case DT_BIND_NOW: return "BIND_NOW";
1711 case DT_INIT_ARRAY: return "INIT_ARRAY";
1712 case DT_FINI_ARRAY: return "FINI_ARRAY";
1713 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1714 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1715 case DT_RUNPATH: return "RUNPATH";
1716 case DT_FLAGS: return "FLAGS";
1717
1718 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1719 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1720
1721 case DT_CHECKSUM: return "CHECKSUM";
1722 case DT_PLTPADSZ: return "PLTPADSZ";
1723 case DT_MOVEENT: return "MOVEENT";
1724 case DT_MOVESZ: return "MOVESZ";
1725 case DT_FEATURE: return "FEATURE";
1726 case DT_POSFLAG_1: return "POSFLAG_1";
1727 case DT_SYMINSZ: return "SYMINSZ";
1728 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1729
1730 case DT_ADDRRNGLO: return "ADDRRNGLO";
1731 case DT_CONFIG: return "CONFIG";
1732 case DT_DEPAUDIT: return "DEPAUDIT";
1733 case DT_AUDIT: return "AUDIT";
1734 case DT_PLTPAD: return "PLTPAD";
1735 case DT_MOVETAB: return "MOVETAB";
1736 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1737
1738 case DT_VERSYM: return "VERSYM";
1739
1740 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1741 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1742 case DT_RELACOUNT: return "RELACOUNT";
1743 case DT_RELCOUNT: return "RELCOUNT";
1744 case DT_FLAGS_1: return "FLAGS_1";
1745 case DT_VERDEF: return "VERDEF";
1746 case DT_VERDEFNUM: return "VERDEFNUM";
1747 case DT_VERNEED: return "VERNEED";
1748 case DT_VERNEEDNUM: return "VERNEEDNUM";
1749
1750 case DT_AUXILIARY: return "AUXILIARY";
1751 case DT_USED: return "USED";
1752 case DT_FILTER: return "FILTER";
1753
1754 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1755 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1756 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1757 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1758 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1759 case DT_GNU_HASH: return "GNU_HASH";
1760
1761 default:
1762 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1763 {
1764 const char * result;
1765
1766 switch (elf_header.e_machine)
1767 {
1768 case EM_MIPS:
1769 case EM_MIPS_RS3_LE:
1770 result = get_mips_dynamic_type (type);
1771 break;
1772 case EM_SPARCV9:
1773 result = get_sparc64_dynamic_type (type);
1774 break;
1775 case EM_PPC:
1776 result = get_ppc_dynamic_type (type);
1777 break;
1778 case EM_PPC64:
1779 result = get_ppc64_dynamic_type (type);
1780 break;
1781 case EM_IA_64:
1782 result = get_ia64_dynamic_type (type);
1783 break;
1784 case EM_ALPHA:
1785 result = get_alpha_dynamic_type (type);
1786 break;
1787 case EM_SCORE:
1788 result = get_score_dynamic_type (type);
1789 break;
1790 case EM_TI_C6000:
1791 result = get_tic6x_dynamic_type (type);
1792 break;
1793 default:
1794 result = NULL;
1795 break;
1796 }
1797
1798 if (result != NULL)
1799 return result;
1800
1801 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1802 }
1803 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1804 || (elf_header.e_machine == EM_PARISC
1805 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1806 {
1807 const char * result;
1808
1809 switch (elf_header.e_machine)
1810 {
1811 case EM_PARISC:
1812 result = get_parisc_dynamic_type (type);
1813 break;
1814 case EM_IA_64:
1815 result = get_ia64_dynamic_type (type);
1816 break;
1817 default:
1818 result = NULL;
1819 break;
1820 }
1821
1822 if (result != NULL)
1823 return result;
1824
1825 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1826 type);
1827 }
1828 else
1829 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1830
1831 return buff;
1832 }
1833 }
1834
1835 static char *
1836 get_file_type (unsigned e_type)
1837 {
1838 static char buff[32];
1839
1840 switch (e_type)
1841 {
1842 case ET_NONE: return _("NONE (None)");
1843 case ET_REL: return _("REL (Relocatable file)");
1844 case ET_EXEC: return _("EXEC (Executable file)");
1845 case ET_DYN: return _("DYN (Shared object file)");
1846 case ET_CORE: return _("CORE (Core file)");
1847
1848 default:
1849 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1850 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1851 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1852 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1853 else
1854 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1855 return buff;
1856 }
1857 }
1858
1859 static char *
1860 get_machine_name (unsigned e_machine)
1861 {
1862 static char buff[64]; /* XXX */
1863
1864 switch (e_machine)
1865 {
1866 case EM_NONE: return _("None");
1867 case EM_M32: return "WE32100";
1868 case EM_SPARC: return "Sparc";
1869 case EM_SPU: return "SPU";
1870 case EM_386: return "Intel 80386";
1871 case EM_68K: return "MC68000";
1872 case EM_88K: return "MC88000";
1873 case EM_486: return "Intel 80486";
1874 case EM_860: return "Intel 80860";
1875 case EM_MIPS: return "MIPS R3000";
1876 case EM_S370: return "IBM System/370";
1877 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1878 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1879 case EM_PARISC: return "HPPA";
1880 case EM_PPC_OLD: return "Power PC (old)";
1881 case EM_SPARC32PLUS: return "Sparc v8+" ;
1882 case EM_960: return "Intel 90860";
1883 case EM_PPC: return "PowerPC";
1884 case EM_PPC64: return "PowerPC64";
1885 case EM_V800: return "NEC V800";
1886 case EM_FR20: return "Fujitsu FR20";
1887 case EM_RH32: return "TRW RH32";
1888 case EM_MCORE: return "MCORE";
1889 case EM_ARM: return "ARM";
1890 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1891 case EM_SH: return "Renesas / SuperH SH";
1892 case EM_SPARCV9: return "Sparc v9";
1893 case EM_TRICORE: return "Siemens Tricore";
1894 case EM_ARC: return "ARC";
1895 case EM_H8_300: return "Renesas H8/300";
1896 case EM_H8_300H: return "Renesas H8/300H";
1897 case EM_H8S: return "Renesas H8S";
1898 case EM_H8_500: return "Renesas H8/500";
1899 case EM_IA_64: return "Intel IA-64";
1900 case EM_MIPS_X: return "Stanford MIPS-X";
1901 case EM_COLDFIRE: return "Motorola Coldfire";
1902 case EM_68HC12: return "Motorola M68HC12";
1903 case EM_ALPHA: return "Alpha";
1904 case EM_CYGNUS_D10V:
1905 case EM_D10V: return "d10v";
1906 case EM_CYGNUS_D30V:
1907 case EM_D30V: return "d30v";
1908 case EM_CYGNUS_M32R:
1909 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1910 case EM_CYGNUS_V850:
1911 case EM_V850: return "NEC v850";
1912 case EM_CYGNUS_MN10300:
1913 case EM_MN10300: return "mn10300";
1914 case EM_CYGNUS_MN10200:
1915 case EM_MN10200: return "mn10200";
1916 case EM_MOXIE: return "Moxie";
1917 case EM_CYGNUS_FR30:
1918 case EM_FR30: return "Fujitsu FR30";
1919 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1920 case EM_PJ_OLD:
1921 case EM_PJ: return "picoJava";
1922 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1923 case EM_PCP: return "Siemens PCP";
1924 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1925 case EM_NDR1: return "Denso NDR1 microprocesspr";
1926 case EM_STARCORE: return "Motorola Star*Core processor";
1927 case EM_ME16: return "Toyota ME16 processor";
1928 case EM_ST100: return "STMicroelectronics ST100 processor";
1929 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1930 case EM_PDSP: return "Sony DSP processor";
1931 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1932 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1933 case EM_FX66: return "Siemens FX66 microcontroller";
1934 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1935 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1936 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1937 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1938 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1939 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1940 case EM_SVX: return "Silicon Graphics SVx";
1941 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1942 case EM_VAX: return "Digital VAX";
1943 case EM_AVR_OLD:
1944 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1945 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1946 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1947 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1948 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1949 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1950 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1951 case EM_PRISM: return "Vitesse Prism";
1952 case EM_X86_64: return "Advanced Micro Devices X86-64";
1953 case EM_L1OM: return "Intel L1OM";
1954 case EM_S390_OLD:
1955 case EM_S390: return "IBM S/390";
1956 case EM_SCORE: return "SUNPLUS S+Core";
1957 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1958 case EM_OPENRISC:
1959 case EM_OR32: return "OpenRISC";
1960 case EM_ARC_A5: return "ARC International ARCompact processor";
1961 case EM_CRX: return "National Semiconductor CRX microprocessor";
1962 case EM_DLX: return "OpenDLX";
1963 case EM_IP2K_OLD:
1964 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1965 case EM_IQ2000: return "Vitesse IQ2000";
1966 case EM_XTENSA_OLD:
1967 case EM_XTENSA: return "Tensilica Xtensa Processor";
1968 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
1969 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
1970 case EM_NS32K: return "National Semiconductor 32000 series";
1971 case EM_TPC: return "Tenor Network TPC processor";
1972 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
1973 case EM_MAX: return "MAX Processor";
1974 case EM_CR: return "National Semiconductor CompactRISC";
1975 case EM_F2MC16: return "Fujitsu F2MC16";
1976 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
1977 case EM_LATTICEMICO32: return "Lattice Mico32";
1978 case EM_M32C_OLD:
1979 case EM_M32C: return "Renesas M32c";
1980 case EM_MT: return "Morpho Techologies MT processor";
1981 case EM_BLACKFIN: return "Analog Devices Blackfin";
1982 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
1983 case EM_SEP: return "Sharp embedded microprocessor";
1984 case EM_ARCA: return "Arca RISC microprocessor";
1985 case EM_UNICORE: return "Unicore";
1986 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
1987 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
1988 case EM_NIOS32: return "Altera Nios";
1989 case EM_ALTERA_NIOS2: return "Altera Nios II";
1990 case EM_C166:
1991 case EM_XC16X: return "Infineon Technologies xc16x";
1992 case EM_M16C: return "Renesas M16C series microprocessors";
1993 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
1994 case EM_CE: return "Freescale Communication Engine RISC core";
1995 case EM_TSK3000: return "Altium TSK3000 core";
1996 case EM_RS08: return "Freescale RS08 embedded processor";
1997 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
1998 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
1999 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2000 case EM_SE_C17: return "Seiko Epson C17 family";
2001 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2002 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2003 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2004 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2005 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2006 case EM_R32C: return "Renesas R32C series microprocessors";
2007 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2008 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2009 case EM_8051: return "Intel 8051 and variants";
2010 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2011 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2012 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2013 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2014 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2015 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2016 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2017 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2018 case EM_CR16:
2019 case EM_CR16_OLD: return "National Semiconductor's CR16";
2020 case EM_MICROBLAZE: return "Xilinx MicroBlaze";
2021 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2022 case EM_RX: return "Renesas RX";
2023 case EM_METAG: return "Imagination Technologies META processor architecture";
2024 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2025 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2026 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2027 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2028 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2029 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2030 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2031 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2032 case EM_CUDA: return "NVIDIA CUDA architecture";
2033 default:
2034 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2035 return buff;
2036 }
2037 }
2038
2039 static void
2040 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2041 {
2042 unsigned eabi;
2043 int unknown = 0;
2044
2045 eabi = EF_ARM_EABI_VERSION (e_flags);
2046 e_flags &= ~ EF_ARM_EABIMASK;
2047
2048 /* Handle "generic" ARM flags. */
2049 if (e_flags & EF_ARM_RELEXEC)
2050 {
2051 strcat (buf, ", relocatable executable");
2052 e_flags &= ~ EF_ARM_RELEXEC;
2053 }
2054
2055 if (e_flags & EF_ARM_HASENTRY)
2056 {
2057 strcat (buf, ", has entry point");
2058 e_flags &= ~ EF_ARM_HASENTRY;
2059 }
2060
2061 /* Now handle EABI specific flags. */
2062 switch (eabi)
2063 {
2064 default:
2065 strcat (buf, ", <unrecognized EABI>");
2066 if (e_flags)
2067 unknown = 1;
2068 break;
2069
2070 case EF_ARM_EABI_VER1:
2071 strcat (buf, ", Version1 EABI");
2072 while (e_flags)
2073 {
2074 unsigned flag;
2075
2076 /* Process flags one bit at a time. */
2077 flag = e_flags & - e_flags;
2078 e_flags &= ~ flag;
2079
2080 switch (flag)
2081 {
2082 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2083 strcat (buf, ", sorted symbol tables");
2084 break;
2085
2086 default:
2087 unknown = 1;
2088 break;
2089 }
2090 }
2091 break;
2092
2093 case EF_ARM_EABI_VER2:
2094 strcat (buf, ", Version2 EABI");
2095 while (e_flags)
2096 {
2097 unsigned flag;
2098
2099 /* Process flags one bit at a time. */
2100 flag = e_flags & - e_flags;
2101 e_flags &= ~ flag;
2102
2103 switch (flag)
2104 {
2105 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2106 strcat (buf, ", sorted symbol tables");
2107 break;
2108
2109 case EF_ARM_DYNSYMSUSESEGIDX:
2110 strcat (buf, ", dynamic symbols use segment index");
2111 break;
2112
2113 case EF_ARM_MAPSYMSFIRST:
2114 strcat (buf, ", mapping symbols precede others");
2115 break;
2116
2117 default:
2118 unknown = 1;
2119 break;
2120 }
2121 }
2122 break;
2123
2124 case EF_ARM_EABI_VER3:
2125 strcat (buf, ", Version3 EABI");
2126 break;
2127
2128 case EF_ARM_EABI_VER4:
2129 strcat (buf, ", Version4 EABI");
2130 goto eabi;
2131
2132 case EF_ARM_EABI_VER5:
2133 strcat (buf, ", Version5 EABI");
2134 eabi:
2135 while (e_flags)
2136 {
2137 unsigned flag;
2138
2139 /* Process flags one bit at a time. */
2140 flag = e_flags & - e_flags;
2141 e_flags &= ~ flag;
2142
2143 switch (flag)
2144 {
2145 case EF_ARM_BE8:
2146 strcat (buf, ", BE8");
2147 break;
2148
2149 case EF_ARM_LE8:
2150 strcat (buf, ", LE8");
2151 break;
2152
2153 default:
2154 unknown = 1;
2155 break;
2156 }
2157 }
2158 break;
2159
2160 case EF_ARM_EABI_UNKNOWN:
2161 strcat (buf, ", GNU EABI");
2162 while (e_flags)
2163 {
2164 unsigned flag;
2165
2166 /* Process flags one bit at a time. */
2167 flag = e_flags & - e_flags;
2168 e_flags &= ~ flag;
2169
2170 switch (flag)
2171 {
2172 case EF_ARM_INTERWORK:
2173 strcat (buf, ", interworking enabled");
2174 break;
2175
2176 case EF_ARM_APCS_26:
2177 strcat (buf, ", uses APCS/26");
2178 break;
2179
2180 case EF_ARM_APCS_FLOAT:
2181 strcat (buf, ", uses APCS/float");
2182 break;
2183
2184 case EF_ARM_PIC:
2185 strcat (buf, ", position independent");
2186 break;
2187
2188 case EF_ARM_ALIGN8:
2189 strcat (buf, ", 8 bit structure alignment");
2190 break;
2191
2192 case EF_ARM_NEW_ABI:
2193 strcat (buf, ", uses new ABI");
2194 break;
2195
2196 case EF_ARM_OLD_ABI:
2197 strcat (buf, ", uses old ABI");
2198 break;
2199
2200 case EF_ARM_SOFT_FLOAT:
2201 strcat (buf, ", software FP");
2202 break;
2203
2204 case EF_ARM_VFP_FLOAT:
2205 strcat (buf, ", VFP");
2206 break;
2207
2208 case EF_ARM_MAVERICK_FLOAT:
2209 strcat (buf, ", Maverick FP");
2210 break;
2211
2212 default:
2213 unknown = 1;
2214 break;
2215 }
2216 }
2217 }
2218
2219 if (unknown)
2220 strcat (buf,_(", <unknown>"));
2221 }
2222
2223 static char *
2224 get_machine_flags (unsigned e_flags, unsigned e_machine)
2225 {
2226 static char buf[1024];
2227
2228 buf[0] = '\0';
2229
2230 if (e_flags)
2231 {
2232 switch (e_machine)
2233 {
2234 default:
2235 break;
2236
2237 case EM_ARM:
2238 decode_ARM_machine_flags (e_flags, buf);
2239 break;
2240
2241 case EM_CYGNUS_FRV:
2242 switch (e_flags & EF_FRV_CPU_MASK)
2243 {
2244 case EF_FRV_CPU_GENERIC:
2245 break;
2246
2247 default:
2248 strcat (buf, ", fr???");
2249 break;
2250
2251 case EF_FRV_CPU_FR300:
2252 strcat (buf, ", fr300");
2253 break;
2254
2255 case EF_FRV_CPU_FR400:
2256 strcat (buf, ", fr400");
2257 break;
2258 case EF_FRV_CPU_FR405:
2259 strcat (buf, ", fr405");
2260 break;
2261
2262 case EF_FRV_CPU_FR450:
2263 strcat (buf, ", fr450");
2264 break;
2265
2266 case EF_FRV_CPU_FR500:
2267 strcat (buf, ", fr500");
2268 break;
2269 case EF_FRV_CPU_FR550:
2270 strcat (buf, ", fr550");
2271 break;
2272
2273 case EF_FRV_CPU_SIMPLE:
2274 strcat (buf, ", simple");
2275 break;
2276 case EF_FRV_CPU_TOMCAT:
2277 strcat (buf, ", tomcat");
2278 break;
2279 }
2280 break;
2281
2282 case EM_68K:
2283 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2284 strcat (buf, ", m68000");
2285 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2286 strcat (buf, ", cpu32");
2287 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2288 strcat (buf, ", fido_a");
2289 else
2290 {
2291 char const * isa = _("unknown");
2292 char const * mac = _("unknown mac");
2293 char const * additional = NULL;
2294
2295 switch (e_flags & EF_M68K_CF_ISA_MASK)
2296 {
2297 case EF_M68K_CF_ISA_A_NODIV:
2298 isa = "A";
2299 additional = ", nodiv";
2300 break;
2301 case EF_M68K_CF_ISA_A:
2302 isa = "A";
2303 break;
2304 case EF_M68K_CF_ISA_A_PLUS:
2305 isa = "A+";
2306 break;
2307 case EF_M68K_CF_ISA_B_NOUSP:
2308 isa = "B";
2309 additional = ", nousp";
2310 break;
2311 case EF_M68K_CF_ISA_B:
2312 isa = "B";
2313 break;
2314 case EF_M68K_CF_ISA_C:
2315 isa = "C";
2316 break;
2317 case EF_M68K_CF_ISA_C_NODIV:
2318 isa = "C";
2319 additional = ", nodiv";
2320 break;
2321 }
2322 strcat (buf, ", cf, isa ");
2323 strcat (buf, isa);
2324 if (additional)
2325 strcat (buf, additional);
2326 if (e_flags & EF_M68K_CF_FLOAT)
2327 strcat (buf, ", float");
2328 switch (e_flags & EF_M68K_CF_MAC_MASK)
2329 {
2330 case 0:
2331 mac = NULL;
2332 break;
2333 case EF_M68K_CF_MAC:
2334 mac = "mac";
2335 break;
2336 case EF_M68K_CF_EMAC:
2337 mac = "emac";
2338 break;
2339 case EF_M68K_CF_EMAC_B:
2340 mac = "emac_b";
2341 break;
2342 }
2343 if (mac)
2344 {
2345 strcat (buf, ", ");
2346 strcat (buf, mac);
2347 }
2348 }
2349 break;
2350
2351 case EM_PPC:
2352 if (e_flags & EF_PPC_EMB)
2353 strcat (buf, ", emb");
2354
2355 if (e_flags & EF_PPC_RELOCATABLE)
2356 strcat (buf, _(", relocatable"));
2357
2358 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2359 strcat (buf, _(", relocatable-lib"));
2360 break;
2361
2362 case EM_V850:
2363 case EM_CYGNUS_V850:
2364 switch (e_flags & EF_V850_ARCH)
2365 {
2366 case E_V850E2V3_ARCH:
2367 strcat (buf, ", v850e2v3");
2368 break;
2369 case E_V850E2_ARCH:
2370 strcat (buf, ", v850e2");
2371 break;
2372 case E_V850E1_ARCH:
2373 strcat (buf, ", v850e1");
2374 break;
2375 case E_V850E_ARCH:
2376 strcat (buf, ", v850e");
2377 break;
2378 case E_V850_ARCH:
2379 strcat (buf, ", v850");
2380 break;
2381 default:
2382 strcat (buf, _(", unknown v850 architecture variant"));
2383 break;
2384 }
2385 break;
2386
2387 case EM_M32R:
2388 case EM_CYGNUS_M32R:
2389 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2390 strcat (buf, ", m32r");
2391 break;
2392
2393 case EM_MIPS:
2394 case EM_MIPS_RS3_LE:
2395 if (e_flags & EF_MIPS_NOREORDER)
2396 strcat (buf, ", noreorder");
2397
2398 if (e_flags & EF_MIPS_PIC)
2399 strcat (buf, ", pic");
2400
2401 if (e_flags & EF_MIPS_CPIC)
2402 strcat (buf, ", cpic");
2403
2404 if (e_flags & EF_MIPS_UCODE)
2405 strcat (buf, ", ugen_reserved");
2406
2407 if (e_flags & EF_MIPS_ABI2)
2408 strcat (buf, ", abi2");
2409
2410 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2411 strcat (buf, ", odk first");
2412
2413 if (e_flags & EF_MIPS_32BITMODE)
2414 strcat (buf, ", 32bitmode");
2415
2416 switch ((e_flags & EF_MIPS_MACH))
2417 {
2418 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2419 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2420 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2421 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2422 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2423 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2424 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2425 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2426 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2427 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2428 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2429 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2430 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2431 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2432 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2433 case 0:
2434 /* We simply ignore the field in this case to avoid confusion:
2435 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2436 extension. */
2437 break;
2438 default: strcat (buf, _(", unknown CPU")); break;
2439 }
2440
2441 switch ((e_flags & EF_MIPS_ABI))
2442 {
2443 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2444 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2445 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2446 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2447 case 0:
2448 /* We simply ignore the field in this case to avoid confusion:
2449 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2450 This means it is likely to be an o32 file, but not for
2451 sure. */
2452 break;
2453 default: strcat (buf, _(", unknown ABI")); break;
2454 }
2455
2456 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2457 strcat (buf, ", mdmx");
2458
2459 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2460 strcat (buf, ", mips16");
2461
2462 switch ((e_flags & EF_MIPS_ARCH))
2463 {
2464 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2465 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2466 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2467 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2468 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2469 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2470 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2471 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2472 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2473 default: strcat (buf, _(", unknown ISA")); break;
2474 }
2475
2476 if (e_flags & EF_SH_PIC)
2477 strcat (buf, ", pic");
2478
2479 if (e_flags & EF_SH_FDPIC)
2480 strcat (buf, ", fdpic");
2481 break;
2482
2483 case EM_SH:
2484 switch ((e_flags & EF_SH_MACH_MASK))
2485 {
2486 case EF_SH1: strcat (buf, ", sh1"); break;
2487 case EF_SH2: strcat (buf, ", sh2"); break;
2488 case EF_SH3: strcat (buf, ", sh3"); break;
2489 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2490 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2491 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2492 case EF_SH3E: strcat (buf, ", sh3e"); break;
2493 case EF_SH4: strcat (buf, ", sh4"); break;
2494 case EF_SH5: strcat (buf, ", sh5"); break;
2495 case EF_SH2E: strcat (buf, ", sh2e"); break;
2496 case EF_SH4A: strcat (buf, ", sh4a"); break;
2497 case EF_SH2A: strcat (buf, ", sh2a"); break;
2498 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2499 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2500 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2501 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2502 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2503 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2504 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2505 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2506 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2507 default: strcat (buf, _(", unknown ISA")); break;
2508 }
2509
2510 break;
2511
2512 case EM_SPARCV9:
2513 if (e_flags & EF_SPARC_32PLUS)
2514 strcat (buf, ", v8+");
2515
2516 if (e_flags & EF_SPARC_SUN_US1)
2517 strcat (buf, ", ultrasparcI");
2518
2519 if (e_flags & EF_SPARC_SUN_US3)
2520 strcat (buf, ", ultrasparcIII");
2521
2522 if (e_flags & EF_SPARC_HAL_R1)
2523 strcat (buf, ", halr1");
2524
2525 if (e_flags & EF_SPARC_LEDATA)
2526 strcat (buf, ", ledata");
2527
2528 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2529 strcat (buf, ", tso");
2530
2531 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2532 strcat (buf, ", pso");
2533
2534 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2535 strcat (buf, ", rmo");
2536 break;
2537
2538 case EM_PARISC:
2539 switch (e_flags & EF_PARISC_ARCH)
2540 {
2541 case EFA_PARISC_1_0:
2542 strcpy (buf, ", PA-RISC 1.0");
2543 break;
2544 case EFA_PARISC_1_1:
2545 strcpy (buf, ", PA-RISC 1.1");
2546 break;
2547 case EFA_PARISC_2_0:
2548 strcpy (buf, ", PA-RISC 2.0");
2549 break;
2550 default:
2551 break;
2552 }
2553 if (e_flags & EF_PARISC_TRAPNIL)
2554 strcat (buf, ", trapnil");
2555 if (e_flags & EF_PARISC_EXT)
2556 strcat (buf, ", ext");
2557 if (e_flags & EF_PARISC_LSB)
2558 strcat (buf, ", lsb");
2559 if (e_flags & EF_PARISC_WIDE)
2560 strcat (buf, ", wide");
2561 if (e_flags & EF_PARISC_NO_KABP)
2562 strcat (buf, ", no kabp");
2563 if (e_flags & EF_PARISC_LAZYSWAP)
2564 strcat (buf, ", lazyswap");
2565 break;
2566
2567 case EM_PJ:
2568 case EM_PJ_OLD:
2569 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2570 strcat (buf, ", new calling convention");
2571
2572 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2573 strcat (buf, ", gnu calling convention");
2574 break;
2575
2576 case EM_IA_64:
2577 if ((e_flags & EF_IA_64_ABI64))
2578 strcat (buf, ", 64-bit");
2579 else
2580 strcat (buf, ", 32-bit");
2581 if ((e_flags & EF_IA_64_REDUCEDFP))
2582 strcat (buf, ", reduced fp model");
2583 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2584 strcat (buf, ", no function descriptors, constant gp");
2585 else if ((e_flags & EF_IA_64_CONS_GP))
2586 strcat (buf, ", constant gp");
2587 if ((e_flags & EF_IA_64_ABSOLUTE))
2588 strcat (buf, ", absolute");
2589 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2590 {
2591 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2592 strcat (buf, ", vms_linkages");
2593 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2594 {
2595 case EF_IA_64_VMS_COMCOD_SUCCESS:
2596 break;
2597 case EF_IA_64_VMS_COMCOD_WARNING:
2598 strcat (buf, ", warning");
2599 break;
2600 case EF_IA_64_VMS_COMCOD_ERROR:
2601 strcat (buf, ", error");
2602 break;
2603 case EF_IA_64_VMS_COMCOD_ABORT:
2604 strcat (buf, ", abort");
2605 break;
2606 default:
2607 abort ();
2608 }
2609 }
2610 break;
2611
2612 case EM_VAX:
2613 if ((e_flags & EF_VAX_NONPIC))
2614 strcat (buf, ", non-PIC");
2615 if ((e_flags & EF_VAX_DFLOAT))
2616 strcat (buf, ", D-Float");
2617 if ((e_flags & EF_VAX_GFLOAT))
2618 strcat (buf, ", G-Float");
2619 break;
2620
2621 case EM_RX:
2622 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2623 strcat (buf, ", 64-bit doubles");
2624 if (e_flags & E_FLAG_RX_DSP)
2625 strcat (buf, ", dsp");
2626
2627 case EM_S390:
2628 if (e_flags & EF_S390_HIGH_GPRS)
2629 strcat (buf, ", highgprs");
2630
2631 case EM_TI_C6000:
2632 if ((e_flags & EF_C6000_REL))
2633 strcat (buf, ", relocatable module");
2634 }
2635 }
2636
2637 return buf;
2638 }
2639
2640 static const char *
2641 get_osabi_name (unsigned int osabi)
2642 {
2643 static char buff[32];
2644
2645 switch (osabi)
2646 {
2647 case ELFOSABI_NONE: return "UNIX - System V";
2648 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2649 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2650 case ELFOSABI_LINUX: return "UNIX - Linux";
2651 case ELFOSABI_HURD: return "GNU/Hurd";
2652 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2653 case ELFOSABI_AIX: return "UNIX - AIX";
2654 case ELFOSABI_IRIX: return "UNIX - IRIX";
2655 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2656 case ELFOSABI_TRU64: return "UNIX - TRU64";
2657 case ELFOSABI_MODESTO: return "Novell - Modesto";
2658 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2659 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2660 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2661 case ELFOSABI_AROS: return "AROS";
2662 case ELFOSABI_FENIXOS: return "FenixOS";
2663 default:
2664 if (osabi >= 64)
2665 switch (elf_header.e_machine)
2666 {
2667 case EM_ARM:
2668 switch (osabi)
2669 {
2670 case ELFOSABI_ARM: return "ARM";
2671 default:
2672 break;
2673 }
2674 break;
2675
2676 case EM_MSP430:
2677 case EM_MSP430_OLD:
2678 switch (osabi)
2679 {
2680 case ELFOSABI_STANDALONE: return _("Standalone App");
2681 default:
2682 break;
2683 }
2684 break;
2685
2686 case EM_TI_C6000:
2687 switch (osabi)
2688 {
2689 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2690 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2691 default:
2692 break;
2693 }
2694 break;
2695
2696 default:
2697 break;
2698 }
2699 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2700 return buff;
2701 }
2702 }
2703
2704 static const char *
2705 get_arm_segment_type (unsigned long type)
2706 {
2707 switch (type)
2708 {
2709 case PT_ARM_EXIDX:
2710 return "EXIDX";
2711 default:
2712 break;
2713 }
2714
2715 return NULL;
2716 }
2717
2718 static const char *
2719 get_mips_segment_type (unsigned long type)
2720 {
2721 switch (type)
2722 {
2723 case PT_MIPS_REGINFO:
2724 return "REGINFO";
2725 case PT_MIPS_RTPROC:
2726 return "RTPROC";
2727 case PT_MIPS_OPTIONS:
2728 return "OPTIONS";
2729 default:
2730 break;
2731 }
2732
2733 return NULL;
2734 }
2735
2736 static const char *
2737 get_parisc_segment_type (unsigned long type)
2738 {
2739 switch (type)
2740 {
2741 case PT_HP_TLS: return "HP_TLS";
2742 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2743 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2744 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2745 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2746 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2747 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2748 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2749 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2750 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2751 case PT_HP_PARALLEL: return "HP_PARALLEL";
2752 case PT_HP_FASTBIND: return "HP_FASTBIND";
2753 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2754 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2755 case PT_HP_STACK: return "HP_STACK";
2756 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2757 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2758 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2759 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2760 default:
2761 break;
2762 }
2763
2764 return NULL;
2765 }
2766
2767 static const char *
2768 get_ia64_segment_type (unsigned long type)
2769 {
2770 switch (type)
2771 {
2772 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2773 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2774 case PT_HP_TLS: return "HP_TLS";
2775 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2776 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2777 case PT_IA_64_HP_STACK: return "HP_STACK";
2778 default:
2779 break;
2780 }
2781
2782 return NULL;
2783 }
2784
2785 static const char *
2786 get_tic6x_segment_type (unsigned long type)
2787 {
2788 switch (type)
2789 {
2790 case PT_C6000_PHATTR: return "C6000_PHATTR";
2791 default:
2792 break;
2793 }
2794
2795 return NULL;
2796 }
2797
2798 static const char *
2799 get_segment_type (unsigned long p_type)
2800 {
2801 static char buff[32];
2802
2803 switch (p_type)
2804 {
2805 case PT_NULL: return "NULL";
2806 case PT_LOAD: return "LOAD";
2807 case PT_DYNAMIC: return "DYNAMIC";
2808 case PT_INTERP: return "INTERP";
2809 case PT_NOTE: return "NOTE";
2810 case PT_SHLIB: return "SHLIB";
2811 case PT_PHDR: return "PHDR";
2812 case PT_TLS: return "TLS";
2813
2814 case PT_GNU_EH_FRAME:
2815 return "GNU_EH_FRAME";
2816 case PT_GNU_STACK: return "GNU_STACK";
2817 case PT_GNU_RELRO: return "GNU_RELRO";
2818
2819 default:
2820 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2821 {
2822 const char * result;
2823
2824 switch (elf_header.e_machine)
2825 {
2826 case EM_ARM:
2827 result = get_arm_segment_type (p_type);
2828 break;
2829 case EM_MIPS:
2830 case EM_MIPS_RS3_LE:
2831 result = get_mips_segment_type (p_type);
2832 break;
2833 case EM_PARISC:
2834 result = get_parisc_segment_type (p_type);
2835 break;
2836 case EM_IA_64:
2837 result = get_ia64_segment_type (p_type);
2838 break;
2839 case EM_TI_C6000:
2840 result = get_tic6x_segment_type (p_type);
2841 break;
2842 default:
2843 result = NULL;
2844 break;
2845 }
2846
2847 if (result != NULL)
2848 return result;
2849
2850 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2851 }
2852 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2853 {
2854 const char * result;
2855
2856 switch (elf_header.e_machine)
2857 {
2858 case EM_PARISC:
2859 result = get_parisc_segment_type (p_type);
2860 break;
2861 case EM_IA_64:
2862 result = get_ia64_segment_type (p_type);
2863 break;
2864 default:
2865 result = NULL;
2866 break;
2867 }
2868
2869 if (result != NULL)
2870 return result;
2871
2872 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2873 }
2874 else
2875 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2876
2877 return buff;
2878 }
2879 }
2880
2881 static const char *
2882 get_mips_section_type_name (unsigned int sh_type)
2883 {
2884 switch (sh_type)
2885 {
2886 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2887 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2888 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2889 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2890 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2891 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2892 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2893 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2894 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2895 case SHT_MIPS_RELD: return "MIPS_RELD";
2896 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2897 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2898 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2899 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2900 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2901 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2902 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2903 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2904 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2905 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2906 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2907 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2908 case SHT_MIPS_LINE: return "MIPS_LINE";
2909 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2910 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2911 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2912 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2913 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2914 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2915 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2916 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2917 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2918 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2919 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2920 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2921 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2922 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2923 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2924 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2925 default:
2926 break;
2927 }
2928 return NULL;
2929 }
2930
2931 static const char *
2932 get_parisc_section_type_name (unsigned int sh_type)
2933 {
2934 switch (sh_type)
2935 {
2936 case SHT_PARISC_EXT: return "PARISC_EXT";
2937 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2938 case SHT_PARISC_DOC: return "PARISC_DOC";
2939 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2940 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2941 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2942 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2943 default:
2944 break;
2945 }
2946 return NULL;
2947 }
2948
2949 static const char *
2950 get_ia64_section_type_name (unsigned int sh_type)
2951 {
2952 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2953 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2954 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2955
2956 switch (sh_type)
2957 {
2958 case SHT_IA_64_EXT: return "IA_64_EXT";
2959 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2960 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2961 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2962 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2963 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2964 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
2965 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
2966 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
2967 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
2968 default:
2969 break;
2970 }
2971 return NULL;
2972 }
2973
2974 static const char *
2975 get_x86_64_section_type_name (unsigned int sh_type)
2976 {
2977 switch (sh_type)
2978 {
2979 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2980 default:
2981 break;
2982 }
2983 return NULL;
2984 }
2985
2986 static const char *
2987 get_arm_section_type_name (unsigned int sh_type)
2988 {
2989 switch (sh_type)
2990 {
2991 case SHT_ARM_EXIDX: return "ARM_EXIDX";
2992 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
2993 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
2994 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
2995 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
2996 default:
2997 break;
2998 }
2999 return NULL;
3000 }
3001
3002 static const char *
3003 get_tic6x_section_type_name (unsigned int sh_type)
3004 {
3005 switch (sh_type)
3006 {
3007 case SHT_C6000_UNWIND:
3008 return "C6000_UNWIND";
3009 case SHT_C6000_PREEMPTMAP:
3010 return "C6000_PREEMPTMAP";
3011 case SHT_C6000_ATTRIBUTES:
3012 return "C6000_ATTRIBUTES";
3013 case SHT_TI_ICODE:
3014 return "TI_ICODE";
3015 case SHT_TI_XREF:
3016 return "TI_XREF";
3017 case SHT_TI_HANDLER:
3018 return "TI_HANDLER";
3019 case SHT_TI_INITINFO:
3020 return "TI_INITINFO";
3021 case SHT_TI_PHATTRS:
3022 return "TI_PHATTRS";
3023 default:
3024 break;
3025 }
3026 return NULL;
3027 }
3028
3029 static const char *
3030 get_section_type_name (unsigned int sh_type)
3031 {
3032 static char buff[32];
3033
3034 switch (sh_type)
3035 {
3036 case SHT_NULL: return "NULL";
3037 case SHT_PROGBITS: return "PROGBITS";
3038 case SHT_SYMTAB: return "SYMTAB";
3039 case SHT_STRTAB: return "STRTAB";
3040 case SHT_RELA: return "RELA";
3041 case SHT_HASH: return "HASH";
3042 case SHT_DYNAMIC: return "DYNAMIC";
3043 case SHT_NOTE: return "NOTE";
3044 case SHT_NOBITS: return "NOBITS";
3045 case SHT_REL: return "REL";
3046 case SHT_SHLIB: return "SHLIB";
3047 case SHT_DYNSYM: return "DYNSYM";
3048 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3049 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3050 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3051 case SHT_GNU_HASH: return "GNU_HASH";
3052 case SHT_GROUP: return "GROUP";
3053 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3054 case SHT_GNU_verdef: return "VERDEF";
3055 case SHT_GNU_verneed: return "VERNEED";
3056 case SHT_GNU_versym: return "VERSYM";
3057 case 0x6ffffff0: return "VERSYM";
3058 case 0x6ffffffc: return "VERDEF";
3059 case 0x7ffffffd: return "AUXILIARY";
3060 case 0x7fffffff: return "FILTER";
3061 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3062
3063 default:
3064 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3065 {
3066 const char * result;
3067
3068 switch (elf_header.e_machine)
3069 {
3070 case EM_MIPS:
3071 case EM_MIPS_RS3_LE:
3072 result = get_mips_section_type_name (sh_type);
3073 break;
3074 case EM_PARISC:
3075 result = get_parisc_section_type_name (sh_type);
3076 break;
3077 case EM_IA_64:
3078 result = get_ia64_section_type_name (sh_type);
3079 break;
3080 case EM_X86_64:
3081 case EM_L1OM:
3082 result = get_x86_64_section_type_name (sh_type);
3083 break;
3084 case EM_ARM:
3085 result = get_arm_section_type_name (sh_type);
3086 break;
3087 case EM_TI_C6000:
3088 result = get_tic6x_section_type_name (sh_type);
3089 break;
3090 default:
3091 result = NULL;
3092 break;
3093 }
3094
3095 if (result != NULL)
3096 return result;
3097
3098 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3099 }
3100 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3101 {
3102 const char * result;
3103
3104 switch (elf_header.e_machine)
3105 {
3106 case EM_IA_64:
3107 result = get_ia64_section_type_name (sh_type);
3108 break;
3109 default:
3110 result = NULL;
3111 break;
3112 }
3113
3114 if (result != NULL)
3115 return result;
3116
3117 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3118 }
3119 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3120 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3121 else
3122 snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
3123
3124 return buff;
3125 }
3126 }
3127
3128 #define OPTION_DEBUG_DUMP 512
3129 #define OPTION_DYN_SYMS 513
3130
3131 static struct option options[] =
3132 {
3133 {"all", no_argument, 0, 'a'},
3134 {"file-header", no_argument, 0, 'h'},
3135 {"program-headers", no_argument, 0, 'l'},
3136 {"headers", no_argument, 0, 'e'},
3137 {"histogram", no_argument, 0, 'I'},
3138 {"segments", no_argument, 0, 'l'},
3139 {"sections", no_argument, 0, 'S'},
3140 {"section-headers", no_argument, 0, 'S'},
3141 {"section-groups", no_argument, 0, 'g'},
3142 {"section-details", no_argument, 0, 't'},
3143 {"full-section-name",no_argument, 0, 'N'},
3144 {"symbols", no_argument, 0, 's'},
3145 {"syms", no_argument, 0, 's'},
3146 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3147 {"relocs", no_argument, 0, 'r'},
3148 {"notes", no_argument, 0, 'n'},
3149 {"dynamic", no_argument, 0, 'd'},
3150 {"arch-specific", no_argument, 0, 'A'},
3151 {"version-info", no_argument, 0, 'V'},
3152 {"use-dynamic", no_argument, 0, 'D'},
3153 {"unwind", no_argument, 0, 'u'},
3154 {"archive-index", no_argument, 0, 'c'},
3155 {"hex-dump", required_argument, 0, 'x'},
3156 {"relocated-dump", required_argument, 0, 'R'},
3157 {"string-dump", required_argument, 0, 'p'},
3158 #ifdef SUPPORT_DISASSEMBLY
3159 {"instruction-dump", required_argument, 0, 'i'},
3160 #endif
3161 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3162
3163 {"version", no_argument, 0, 'v'},
3164 {"wide", no_argument, 0, 'W'},
3165 {"help", no_argument, 0, 'H'},
3166 {0, no_argument, 0, 0}
3167 };
3168
3169 static void
3170 usage (FILE * stream)
3171 {
3172 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3173 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3174 fprintf (stream, _(" Options are:\n\
3175 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3176 -h --file-header Display the ELF file header\n\
3177 -l --program-headers Display the program headers\n\
3178 --segments An alias for --program-headers\n\
3179 -S --section-headers Display the sections' header\n\
3180 --sections An alias for --section-headers\n\
3181 -g --section-groups Display the section groups\n\
3182 -t --section-details Display the section details\n\
3183 -e --headers Equivalent to: -h -l -S\n\
3184 -s --syms Display the symbol table\n\
3185 --symbols An alias for --syms\n\
3186 --dyn-syms Display the dynamic symbol table\n\
3187 -n --notes Display the core notes (if present)\n\
3188 -r --relocs Display the relocations (if present)\n\
3189 -u --unwind Display the unwind info (if present)\n\
3190 -d --dynamic Display the dynamic section (if present)\n\
3191 -V --version-info Display the version sections (if present)\n\
3192 -A --arch-specific Display architecture specific information (if any).\n\
3193 -c --archive-index Display the symbol/file index in an archive\n\
3194 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3195 -x --hex-dump=<number|name>\n\
3196 Dump the contents of section <number|name> as bytes\n\
3197 -p --string-dump=<number|name>\n\
3198 Dump the contents of section <number|name> as strings\n\
3199 -R --relocated-dump=<number|name>\n\
3200 Dump the contents of section <number|name> as relocated bytes\n\
3201 -w[lLiaprmfFsoRt] or\n\
3202 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3203 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3204 =trace_info,=trace_abbrev,=trace_aranges]\n\
3205 Display the contents of DWARF2 debug sections\n"));
3206 #ifdef SUPPORT_DISASSEMBLY
3207 fprintf (stream, _("\
3208 -i --instruction-dump=<number|name>\n\
3209 Disassemble the contents of section <number|name>\n"));
3210 #endif
3211 fprintf (stream, _("\
3212 -I --histogram Display histogram of bucket list lengths\n\
3213 -W --wide Allow output width to exceed 80 characters\n\
3214 @<file> Read options from <file>\n\
3215 -H --help Display this information\n\
3216 -v --version Display the version number of readelf\n"));
3217
3218 if (REPORT_BUGS_TO[0] && stream == stdout)
3219 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3220
3221 exit (stream == stdout ? 0 : 1);
3222 }
3223
3224 /* Record the fact that the user wants the contents of section number
3225 SECTION to be displayed using the method(s) encoded as flags bits
3226 in TYPE. Note, TYPE can be zero if we are creating the array for
3227 the first time. */
3228
3229 static void
3230 request_dump_bynumber (unsigned int section, dump_type type)
3231 {
3232 if (section >= num_dump_sects)
3233 {
3234 dump_type * new_dump_sects;
3235
3236 new_dump_sects = (dump_type *) calloc (section + 1,
3237 sizeof (* dump_sects));
3238
3239 if (new_dump_sects == NULL)
3240 error (_("Out of memory allocating dump request table.\n"));
3241 else
3242 {
3243 /* Copy current flag settings. */
3244 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3245
3246 free (dump_sects);
3247
3248 dump_sects = new_dump_sects;
3249 num_dump_sects = section + 1;
3250 }
3251 }
3252
3253 if (dump_sects)
3254 dump_sects[section] |= type;
3255
3256 return;
3257 }
3258
3259 /* Request a dump by section name. */
3260
3261 static void
3262 request_dump_byname (const char * section, dump_type type)
3263 {
3264 struct dump_list_entry * new_request;
3265
3266 new_request = (struct dump_list_entry *)
3267 malloc (sizeof (struct dump_list_entry));
3268 if (!new_request)
3269 error (_("Out of memory allocating dump request table.\n"));
3270
3271 new_request->name = strdup (section);
3272 if (!new_request->name)
3273 error (_("Out of memory allocating dump request table.\n"));
3274
3275 new_request->type = type;
3276
3277 new_request->next = dump_sects_byname;
3278 dump_sects_byname = new_request;
3279 }
3280
3281 static inline void
3282 request_dump (dump_type type)
3283 {
3284 int section;
3285 char * cp;
3286
3287 do_dump++;
3288 section = strtoul (optarg, & cp, 0);
3289
3290 if (! *cp && section >= 0)
3291 request_dump_bynumber (section, type);
3292 else
3293 request_dump_byname (optarg, type);
3294 }
3295
3296
3297 static void
3298 parse_args (int argc, char ** argv)
3299 {
3300 int c;
3301
3302 if (argc < 2)
3303 usage (stderr);
3304
3305 while ((c = getopt_long
3306 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3307 {
3308 switch (c)
3309 {
3310 case 0:
3311 /* Long options. */
3312 break;
3313 case 'H':
3314 usage (stdout);
3315 break;
3316
3317 case 'a':
3318 do_syms++;
3319 do_reloc++;
3320 do_unwind++;
3321 do_dynamic++;
3322 do_header++;
3323 do_sections++;
3324 do_section_groups++;
3325 do_segments++;
3326 do_version++;
3327 do_histogram++;
3328 do_arch++;
3329 do_notes++;
3330 break;
3331 case 'g':
3332 do_section_groups++;
3333 break;
3334 case 't':
3335 case 'N':
3336 do_sections++;
3337 do_section_details++;
3338 break;
3339 case 'e':
3340 do_header++;
3341 do_sections++;
3342 do_segments++;
3343 break;
3344 case 'A':
3345 do_arch++;
3346 break;
3347 case 'D':
3348 do_using_dynamic++;
3349 break;
3350 case 'r':
3351 do_reloc++;
3352 break;
3353 case 'u':
3354 do_unwind++;
3355 break;
3356 case 'h':
3357 do_header++;
3358 break;
3359 case 'l':
3360 do_segments++;
3361 break;
3362 case 's':
3363 do_syms++;
3364 break;
3365 case 'S':
3366 do_sections++;
3367 break;
3368 case 'd':
3369 do_dynamic++;
3370 break;
3371 case 'I':
3372 do_histogram++;
3373 break;
3374 case 'n':
3375 do_notes++;
3376 break;
3377 case 'c':
3378 do_archive_index++;
3379 break;
3380 case 'x':
3381 request_dump (HEX_DUMP);
3382 break;
3383 case 'p':
3384 request_dump (STRING_DUMP);
3385 break;
3386 case 'R':
3387 request_dump (RELOC_DUMP);
3388 break;
3389 case 'w':
3390 do_dump++;
3391 if (optarg == 0)
3392 {
3393 do_debugging = 1;
3394 dwarf_select_sections_all ();
3395 }
3396 else
3397 {
3398 do_debugging = 0;
3399 dwarf_select_sections_by_letters (optarg);
3400 }
3401 break;
3402 case OPTION_DEBUG_DUMP:
3403 do_dump++;
3404 if (optarg == 0)
3405 do_debugging = 1;
3406 else
3407 {
3408 do_debugging = 0;
3409 dwarf_select_sections_by_names (optarg);
3410 }
3411 break;
3412 case OPTION_DYN_SYMS:
3413 do_dyn_syms++;
3414 break;
3415 #ifdef SUPPORT_DISASSEMBLY
3416 case 'i':
3417 request_dump (DISASS_DUMP);
3418 break;
3419 #endif
3420 case 'v':
3421 print_version (program_name);
3422 break;
3423 case 'V':
3424 do_version++;
3425 break;
3426 case 'W':
3427 do_wide++;
3428 break;
3429 default:
3430 /* xgettext:c-format */
3431 error (_("Invalid option '-%c'\n"), c);
3432 /* Drop through. */
3433 case '?':
3434 usage (stderr);
3435 }
3436 }
3437
3438 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3439 && !do_segments && !do_header && !do_dump && !do_version
3440 && !do_histogram && !do_debugging && !do_arch && !do_notes
3441 && !do_section_groups && !do_archive_index
3442 && !do_dyn_syms)
3443 usage (stderr);
3444 else if (argc < 3)
3445 {
3446 warn (_("Nothing to do.\n"));
3447 usage (stderr);
3448 }
3449 }
3450
3451 static const char *
3452 get_elf_class (unsigned int elf_class)
3453 {
3454 static char buff[32];
3455
3456 switch (elf_class)
3457 {
3458 case ELFCLASSNONE: return _("none");
3459 case ELFCLASS32: return "ELF32";
3460 case ELFCLASS64: return "ELF64";
3461 default:
3462 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3463 return buff;
3464 }
3465 }
3466
3467 static const char *
3468 get_data_encoding (unsigned int encoding)
3469 {
3470 static char buff[32];
3471
3472 switch (encoding)
3473 {
3474 case ELFDATANONE: return _("none");
3475 case ELFDATA2LSB: return _("2's complement, little endian");
3476 case ELFDATA2MSB: return _("2's complement, big endian");
3477 default:
3478 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3479 return buff;
3480 }
3481 }
3482
3483 /* Decode the data held in 'elf_header'. */
3484
3485 static int
3486 process_file_header (void)
3487 {
3488 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3489 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3490 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3491 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3492 {
3493 error
3494 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3495 return 0;
3496 }
3497
3498 init_dwarf_regnames (elf_header.e_machine);
3499
3500 if (do_header)
3501 {
3502 int i;
3503
3504 printf (_("ELF Header:\n"));
3505 printf (_(" Magic: "));
3506 for (i = 0; i < EI_NIDENT; i++)
3507 printf ("%2.2x ", elf_header.e_ident[i]);
3508 printf ("\n");
3509 printf (_(" Class: %s\n"),
3510 get_elf_class (elf_header.e_ident[EI_CLASS]));
3511 printf (_(" Data: %s\n"),
3512 get_data_encoding (elf_header.e_ident[EI_DATA]));
3513 printf (_(" Version: %d %s\n"),
3514 elf_header.e_ident[EI_VERSION],
3515 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3516 ? "(current)"
3517 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3518 ? _("<unknown: %lx>")
3519 : "")));
3520 printf (_(" OS/ABI: %s\n"),
3521 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3522 printf (_(" ABI Version: %d\n"),
3523 elf_header.e_ident[EI_ABIVERSION]);
3524 printf (_(" Type: %s\n"),
3525 get_file_type (elf_header.e_type));
3526 printf (_(" Machine: %s\n"),
3527 get_machine_name (elf_header.e_machine));
3528 printf (_(" Version: 0x%lx\n"),
3529 (unsigned long) elf_header.e_version);
3530
3531 printf (_(" Entry point address: "));
3532 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3533 printf (_("\n Start of program headers: "));
3534 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3535 printf (_(" (bytes into file)\n Start of section headers: "));
3536 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3537 printf (_(" (bytes into file)\n"));
3538
3539 printf (_(" Flags: 0x%lx%s\n"),
3540 (unsigned long) elf_header.e_flags,
3541 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3542 printf (_(" Size of this header: %ld (bytes)\n"),
3543 (long) elf_header.e_ehsize);
3544 printf (_(" Size of program headers: %ld (bytes)\n"),
3545 (long) elf_header.e_phentsize);
3546 printf (_(" Number of program headers: %ld"),
3547 (long) elf_header.e_phnum);
3548 if (section_headers != NULL
3549 && elf_header.e_phnum == PN_XNUM
3550 && section_headers[0].sh_info != 0)
3551 printf (_(" (%ld)"), (long) section_headers[0].sh_info);
3552 putc ('\n', stdout);
3553 printf (_(" Size of section headers: %ld (bytes)\n"),
3554 (long) elf_header.e_shentsize);
3555 printf (_(" Number of section headers: %ld"),
3556 (long) elf_header.e_shnum);
3557 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3558 printf (" (%ld)", (long) section_headers[0].sh_size);
3559 putc ('\n', stdout);
3560 printf (_(" Section header string table index: %ld"),
3561 (long) elf_header.e_shstrndx);
3562 if (section_headers != NULL
3563 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3564 printf (" (%u)", section_headers[0].sh_link);
3565 else if (elf_header.e_shstrndx != SHN_UNDEF
3566 && elf_header.e_shstrndx >= elf_header.e_shnum)
3567 printf (_(" <corrupt: out of range>"));
3568 putc ('\n', stdout);
3569 }
3570
3571 if (section_headers != NULL)
3572 {
3573 if (elf_header.e_phnum == PN_XNUM
3574 && section_headers[0].sh_info != 0)
3575 elf_header.e_phnum = section_headers[0].sh_info;
3576 if (elf_header.e_shnum == SHN_UNDEF)
3577 elf_header.e_shnum = section_headers[0].sh_size;
3578 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3579 elf_header.e_shstrndx = section_headers[0].sh_link;
3580 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3581 elf_header.e_shstrndx = SHN_UNDEF;
3582 free (section_headers);
3583 section_headers = NULL;
3584 }
3585
3586 return 1;
3587 }
3588
3589
3590 static int
3591 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3592 {
3593 Elf32_External_Phdr * phdrs;
3594 Elf32_External_Phdr * external;
3595 Elf_Internal_Phdr * internal;
3596 unsigned int i;
3597
3598 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3599 elf_header.e_phentsize,
3600 elf_header.e_phnum,
3601 _("program headers"));
3602 if (!phdrs)
3603 return 0;
3604
3605 for (i = 0, internal = pheaders, external = phdrs;
3606 i < elf_header.e_phnum;
3607 i++, internal++, external++)
3608 {
3609 internal->p_type = BYTE_GET (external->p_type);
3610 internal->p_offset = BYTE_GET (external->p_offset);
3611 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3612 internal->p_paddr = BYTE_GET (external->p_paddr);
3613 internal->p_filesz = BYTE_GET (external->p_filesz);
3614 internal->p_memsz = BYTE_GET (external->p_memsz);
3615 internal->p_flags = BYTE_GET (external->p_flags);
3616 internal->p_align = BYTE_GET (external->p_align);
3617 }
3618
3619 free (phdrs);
3620
3621 return 1;
3622 }
3623
3624 static int
3625 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3626 {
3627 Elf64_External_Phdr * phdrs;
3628 Elf64_External_Phdr * external;
3629 Elf_Internal_Phdr * internal;
3630 unsigned int i;
3631
3632 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3633 elf_header.e_phentsize,
3634 elf_header.e_phnum,
3635 _("program headers"));
3636 if (!phdrs)
3637 return 0;
3638
3639 for (i = 0, internal = pheaders, external = phdrs;
3640 i < elf_header.e_phnum;
3641 i++, internal++, external++)
3642 {
3643 internal->p_type = BYTE_GET (external->p_type);
3644 internal->p_flags = BYTE_GET (external->p_flags);
3645 internal->p_offset = BYTE_GET (external->p_offset);
3646 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3647 internal->p_paddr = BYTE_GET (external->p_paddr);
3648 internal->p_filesz = BYTE_GET (external->p_filesz);
3649 internal->p_memsz = BYTE_GET (external->p_memsz);
3650 internal->p_align = BYTE_GET (external->p_align);
3651 }
3652
3653 free (phdrs);
3654
3655 return 1;
3656 }
3657
3658 /* Returns 1 if the program headers were read into `program_headers'. */
3659
3660 static int
3661 get_program_headers (FILE * file)
3662 {
3663 Elf_Internal_Phdr * phdrs;
3664
3665 /* Check cache of prior read. */
3666 if (program_headers != NULL)
3667 return 1;
3668
3669 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3670 sizeof (Elf_Internal_Phdr));
3671
3672 if (phdrs == NULL)
3673 {
3674 error (_("Out of memory\n"));
3675 return 0;
3676 }
3677
3678 if (is_32bit_elf
3679 ? get_32bit_program_headers (file, phdrs)
3680 : get_64bit_program_headers (file, phdrs))
3681 {
3682 program_headers = phdrs;
3683 return 1;
3684 }
3685
3686 free (phdrs);
3687 return 0;
3688 }
3689
3690 /* Returns 1 if the program headers were loaded. */
3691
3692 static int
3693 process_program_headers (FILE * file)
3694 {
3695 Elf_Internal_Phdr * segment;
3696 unsigned int i;
3697
3698 if (elf_header.e_phnum == 0)
3699 {
3700 if (do_segments)
3701 printf (_("\nThere are no program headers in this file.\n"));
3702 return 0;
3703 }
3704
3705 if (do_segments && !do_header)
3706 {
3707 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3708 printf (_("Entry point "));
3709 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3710 printf (_("\nThere are %d program headers, starting at offset "),
3711 elf_header.e_phnum);
3712 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3713 printf ("\n");
3714 }
3715
3716 if (! get_program_headers (file))
3717 return 0;
3718
3719 if (do_segments)
3720 {
3721 if (elf_header.e_phnum > 1)
3722 printf (_("\nProgram Headers:\n"));
3723 else
3724 printf (_("\nProgram Headers:\n"));
3725
3726 if (is_32bit_elf)
3727 printf
3728 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3729 else if (do_wide)
3730 printf
3731 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3732 else
3733 {
3734 printf
3735 (_(" Type Offset VirtAddr PhysAddr\n"));
3736 printf
3737 (_(" FileSiz MemSiz Flags Align\n"));
3738 }
3739 }
3740
3741 dynamic_addr = 0;
3742 dynamic_size = 0;
3743
3744 for (i = 0, segment = program_headers;
3745 i < elf_header.e_phnum;
3746 i++, segment++)
3747 {
3748 if (do_segments)
3749 {
3750 printf (" %-14.14s ", get_segment_type (segment->p_type));
3751
3752 if (is_32bit_elf)
3753 {
3754 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3755 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3756 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3757 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3758 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3759 printf ("%c%c%c ",
3760 (segment->p_flags & PF_R ? 'R' : ' '),
3761 (segment->p_flags & PF_W ? 'W' : ' '),
3762 (segment->p_flags & PF_X ? 'E' : ' '));
3763 printf ("%#lx", (unsigned long) segment->p_align);
3764 }
3765 else if (do_wide)
3766 {
3767 if ((unsigned long) segment->p_offset == segment->p_offset)
3768 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3769 else
3770 {
3771 print_vma (segment->p_offset, FULL_HEX);
3772 putchar (' ');
3773 }
3774
3775 print_vma (segment->p_vaddr, FULL_HEX);
3776 putchar (' ');
3777 print_vma (segment->p_paddr, FULL_HEX);
3778 putchar (' ');
3779
3780 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3781 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3782 else
3783 {
3784 print_vma (segment->p_filesz, FULL_HEX);
3785 putchar (' ');
3786 }
3787
3788 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3789 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3790 else
3791 {
3792 print_vma (segment->p_offset, FULL_HEX);
3793 }
3794
3795 printf (" %c%c%c ",
3796 (segment->p_flags & PF_R ? 'R' : ' '),
3797 (segment->p_flags & PF_W ? 'W' : ' '),
3798 (segment->p_flags & PF_X ? 'E' : ' '));
3799
3800 if ((unsigned long) segment->p_align == segment->p_align)
3801 printf ("%#lx", (unsigned long) segment->p_align);
3802 else
3803 {
3804 print_vma (segment->p_align, PREFIX_HEX);
3805 }
3806 }
3807 else
3808 {
3809 print_vma (segment->p_offset, FULL_HEX);
3810 putchar (' ');
3811 print_vma (segment->p_vaddr, FULL_HEX);
3812 putchar (' ');
3813 print_vma (segment->p_paddr, FULL_HEX);
3814 printf ("\n ");
3815 print_vma (segment->p_filesz, FULL_HEX);
3816 putchar (' ');
3817 print_vma (segment->p_memsz, FULL_HEX);
3818 printf (" %c%c%c ",
3819 (segment->p_flags & PF_R ? 'R' : ' '),
3820 (segment->p_flags & PF_W ? 'W' : ' '),
3821 (segment->p_flags & PF_X ? 'E' : ' '));
3822 print_vma (segment->p_align, HEX);
3823 }
3824 }
3825
3826 switch (segment->p_type)
3827 {
3828 case PT_DYNAMIC:
3829 if (dynamic_addr)
3830 error (_("more than one dynamic segment\n"));
3831
3832 /* By default, assume that the .dynamic section is the first
3833 section in the DYNAMIC segment. */
3834 dynamic_addr = segment->p_offset;
3835 dynamic_size = segment->p_filesz;
3836
3837 /* Try to locate the .dynamic section. If there is
3838 a section header table, we can easily locate it. */
3839 if (section_headers != NULL)
3840 {
3841 Elf_Internal_Shdr * sec;
3842
3843 sec = find_section (".dynamic");
3844 if (sec == NULL || sec->sh_size == 0)
3845 {
3846 /* A corresponding .dynamic section is expected, but on
3847 IA-64/OpenVMS it is OK for it to be missing. */
3848 if (!is_ia64_vms ())
3849 error (_("no .dynamic section in the dynamic segment\n"));
3850 break;
3851 }
3852
3853 if (sec->sh_type == SHT_NOBITS)
3854 {
3855 dynamic_size = 0;
3856 break;
3857 }
3858
3859 dynamic_addr = sec->sh_offset;
3860 dynamic_size = sec->sh_size;
3861
3862 if (dynamic_addr < segment->p_offset
3863 || dynamic_addr > segment->p_offset + segment->p_filesz)
3864 warn (_("the .dynamic section is not contained"
3865 " within the dynamic segment\n"));
3866 else if (dynamic_addr > segment->p_offset)
3867 warn (_("the .dynamic section is not the first section"
3868 " in the dynamic segment.\n"));
3869 }
3870 break;
3871
3872 case PT_INTERP:
3873 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3874 SEEK_SET))
3875 error (_("Unable to find program interpreter name\n"));
3876 else
3877 {
3878 char fmt [32];
3879 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3880
3881 if (ret >= (int) sizeof (fmt) || ret < 0)
3882 error (_("Internal error: failed to create format string to display program interpreter\n"));
3883
3884 program_interpreter[0] = 0;
3885 if (fscanf (file, fmt, program_interpreter) <= 0)
3886 error (_("Unable to read program interpreter name\n"));
3887
3888 if (do_segments)
3889 printf (_("\n [Requesting program interpreter: %s]"),
3890 program_interpreter);
3891 }
3892 break;
3893 }
3894
3895 if (do_segments)
3896 putc ('\n', stdout);
3897 }
3898
3899 if (do_segments && section_headers != NULL && string_table != NULL)
3900 {
3901 printf (_("\n Section to Segment mapping:\n"));
3902 printf (_(" Segment Sections...\n"));
3903
3904 for (i = 0; i < elf_header.e_phnum; i++)
3905 {
3906 unsigned int j;
3907 Elf_Internal_Shdr * section;
3908
3909 segment = program_headers + i;
3910 section = section_headers + 1;
3911
3912 printf (" %2.2d ", i);
3913
3914 for (j = 1; j < elf_header.e_shnum; j++, section++)
3915 {
3916 if (!ELF_TBSS_SPECIAL (section, segment)
3917 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
3918 printf ("%s ", SECTION_NAME (section));
3919 }
3920
3921 putc ('\n',stdout);
3922 }
3923 }
3924
3925 return 1;
3926 }
3927
3928
3929 /* Find the file offset corresponding to VMA by using the program headers. */
3930
3931 static long
3932 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
3933 {
3934 Elf_Internal_Phdr * seg;
3935
3936 if (! get_program_headers (file))
3937 {
3938 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3939 return (long) vma;
3940 }
3941
3942 for (seg = program_headers;
3943 seg < program_headers + elf_header.e_phnum;
3944 ++seg)
3945 {
3946 if (seg->p_type != PT_LOAD)
3947 continue;
3948
3949 if (vma >= (seg->p_vaddr & -seg->p_align)
3950 && vma + size <= seg->p_vaddr + seg->p_filesz)
3951 return vma - seg->p_vaddr + seg->p_offset;
3952 }
3953
3954 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3955 (unsigned long) vma);
3956 return (long) vma;
3957 }
3958
3959
3960 static int
3961 get_32bit_section_headers (FILE * file, unsigned int num)
3962 {
3963 Elf32_External_Shdr * shdrs;
3964 Elf_Internal_Shdr * internal;
3965 unsigned int i;
3966
3967 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3968 elf_header.e_shentsize, num,
3969 _("section headers"));
3970 if (!shdrs)
3971 return 0;
3972
3973 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3974 sizeof (Elf_Internal_Shdr));
3975
3976 if (section_headers == NULL)
3977 {
3978 error (_("Out of memory\n"));
3979 return 0;
3980 }
3981
3982 for (i = 0, internal = section_headers;
3983 i < num;
3984 i++, internal++)
3985 {
3986 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3987 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3988 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3989 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3990 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3991 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3992 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3993 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3994 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3995 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3996 }
3997
3998 free (shdrs);
3999
4000 return 1;
4001 }
4002
4003 static int
4004 get_64bit_section_headers (FILE * file, unsigned int num)
4005 {
4006 Elf64_External_Shdr * shdrs;
4007 Elf_Internal_Shdr * internal;
4008 unsigned int i;
4009
4010 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4011 elf_header.e_shentsize, num,
4012 _("section headers"));
4013 if (!shdrs)
4014 return 0;
4015
4016 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4017 sizeof (Elf_Internal_Shdr));
4018
4019 if (section_headers == NULL)
4020 {
4021 error (_("Out of memory\n"));
4022 return 0;
4023 }
4024
4025 for (i = 0, internal = section_headers;
4026 i < num;
4027 i++, internal++)
4028 {
4029 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4030 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4031 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4032 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4033 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4034 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4035 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4036 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4037 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4038 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4039 }
4040
4041 free (shdrs);
4042
4043 return 1;
4044 }
4045
4046 static Elf_Internal_Sym *
4047 get_32bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4048 {
4049 unsigned long number;
4050 Elf32_External_Sym * esyms = NULL;
4051 Elf_External_Sym_Shndx * shndx;
4052 Elf_Internal_Sym * isyms = NULL;
4053 Elf_Internal_Sym * psym;
4054 unsigned int j;
4055
4056 /* Run some sanity checks first. */
4057 if (section->sh_entsize == 0)
4058 {
4059 error (_("sh_entsize is zero\n"));
4060 return NULL;
4061 }
4062
4063 number = section->sh_size / section->sh_entsize;
4064
4065 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4066 {
4067 error (_("Invalid sh_entsize\n"));
4068 return NULL;
4069 }
4070
4071 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4072 section->sh_size, _("symbols"));
4073 if (esyms == NULL)
4074 return NULL;
4075
4076 shndx = NULL;
4077 if (symtab_shndx_hdr != NULL
4078 && (symtab_shndx_hdr->sh_link
4079 == (unsigned long) (section - section_headers)))
4080 {
4081 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4082 symtab_shndx_hdr->sh_offset,
4083 1, symtab_shndx_hdr->sh_size,
4084 _("symtab shndx"));
4085 if (shndx == NULL)
4086 goto exit_point;
4087 }
4088
4089 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4090
4091 if (isyms == NULL)
4092 {
4093 error (_("Out of memory\n"));
4094 goto exit_point;
4095 }
4096
4097 for (j = 0, psym = isyms; j < number; j++, psym++)
4098 {
4099 psym->st_name = BYTE_GET (esyms[j].st_name);
4100 psym->st_value = BYTE_GET (esyms[j].st_value);
4101 psym->st_size = BYTE_GET (esyms[j].st_size);
4102 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4103 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4104 psym->st_shndx
4105 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4106 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4107 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4108 psym->st_info = BYTE_GET (esyms[j].st_info);
4109 psym->st_other = BYTE_GET (esyms[j].st_other);
4110 }
4111
4112 exit_point:
4113 if (shndx)
4114 free (shndx);
4115 if (esyms)
4116 free (esyms);
4117
4118 return isyms;
4119 }
4120
4121 static Elf_Internal_Sym *
4122 get_64bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4123 {
4124 unsigned long number;
4125 Elf64_External_Sym * esyms;
4126 Elf_External_Sym_Shndx * shndx;
4127 Elf_Internal_Sym * isyms;
4128 Elf_Internal_Sym * psym;
4129 unsigned int j;
4130
4131 /* Run some sanity checks first. */
4132 if (section->sh_entsize == 0)
4133 {
4134 error (_("sh_entsize is zero\n"));
4135 return NULL;
4136 }
4137
4138 number = section->sh_size / section->sh_entsize;
4139
4140 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4141 {
4142 error (_("Invalid sh_entsize\n"));
4143 return NULL;
4144 }
4145
4146 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4147 section->sh_size, _("symbols"));
4148 if (!esyms)
4149 return NULL;
4150
4151 shndx = NULL;
4152 if (symtab_shndx_hdr != NULL
4153 && (symtab_shndx_hdr->sh_link
4154 == (unsigned long) (section - section_headers)))
4155 {
4156 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4157 symtab_shndx_hdr->sh_offset,
4158 1, symtab_shndx_hdr->sh_size,
4159 _("symtab shndx"));
4160 if (!shndx)
4161 {
4162 free (esyms);
4163 return NULL;
4164 }
4165 }
4166
4167 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4168
4169 if (isyms == NULL)
4170 {
4171 error (_("Out of memory\n"));
4172 if (shndx)
4173 free (shndx);
4174 free (esyms);
4175 return NULL;
4176 }
4177
4178 for (j = 0, psym = isyms;
4179 j < number;
4180 j++, psym++)
4181 {
4182 psym->st_name = BYTE_GET (esyms[j].st_name);
4183 psym->st_info = BYTE_GET (esyms[j].st_info);
4184 psym->st_other = BYTE_GET (esyms[j].st_other);
4185 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4186 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4187 psym->st_shndx
4188 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4189 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4190 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4191 psym->st_value = BYTE_GET (esyms[j].st_value);
4192 psym->st_size = BYTE_GET (esyms[j].st_size);
4193 }
4194
4195 if (shndx)
4196 free (shndx);
4197 free (esyms);
4198
4199 return isyms;
4200 }
4201
4202 static const char *
4203 get_elf_section_flags (bfd_vma sh_flags)
4204 {
4205 static char buff[1024];
4206 char * p = buff;
4207 int field_size = is_32bit_elf ? 8 : 16;
4208 int sindex;
4209 int size = sizeof (buff) - (field_size + 4 + 1);
4210 bfd_vma os_flags = 0;
4211 bfd_vma proc_flags = 0;
4212 bfd_vma unknown_flags = 0;
4213 static const struct
4214 {
4215 const char * str;
4216 int len;
4217 }
4218 flags [] =
4219 {
4220 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4221 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4222 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4223 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4224 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4225 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4226 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4227 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4228 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4229 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4230 /* IA-64 specific. */
4231 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4232 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4233 /* IA-64 OpenVMS specific. */
4234 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4235 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4236 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4237 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4238 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4239 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4240 /* Generic. */
4241 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4242 /* SPARC specific. */
4243 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4244 };
4245
4246 if (do_section_details)
4247 {
4248 sprintf (buff, "[%*.*lx]: ",
4249 field_size, field_size, (unsigned long) sh_flags);
4250 p += field_size + 4;
4251 }
4252
4253 while (sh_flags)
4254 {
4255 bfd_vma flag;
4256
4257 flag = sh_flags & - sh_flags;
4258 sh_flags &= ~ flag;
4259
4260 if (do_section_details)
4261 {
4262 switch (flag)
4263 {
4264 case SHF_WRITE: sindex = 0; break;
4265 case SHF_ALLOC: sindex = 1; break;
4266 case SHF_EXECINSTR: sindex = 2; break;
4267 case SHF_MERGE: sindex = 3; break;
4268 case SHF_STRINGS: sindex = 4; break;
4269 case SHF_INFO_LINK: sindex = 5; break;
4270 case SHF_LINK_ORDER: sindex = 6; break;
4271 case SHF_OS_NONCONFORMING: sindex = 7; break;
4272 case SHF_GROUP: sindex = 8; break;
4273 case SHF_TLS: sindex = 9; break;
4274 case SHF_EXCLUDE: sindex = 18; break;
4275
4276 default:
4277 sindex = -1;
4278 switch (elf_header.e_machine)
4279 {
4280 case EM_IA_64:
4281 if (flag == SHF_IA_64_SHORT)
4282 sindex = 10;
4283 else if (flag == SHF_IA_64_NORECOV)
4284 sindex = 11;
4285 #ifdef BFD64
4286 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4287 switch (flag)
4288 {
4289 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4290 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4291 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4292 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4293 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4294 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4295 default: break;
4296 }
4297 #endif
4298 break;
4299
4300 case EM_386:
4301 case EM_486:
4302 case EM_X86_64:
4303 case EM_L1OM:
4304 case EM_OLD_SPARCV9:
4305 case EM_SPARC32PLUS:
4306 case EM_SPARCV9:
4307 case EM_SPARC:
4308 if (flag == SHF_ORDERED)
4309 sindex = 19;
4310 break;
4311 default:
4312 break;
4313 }
4314 }
4315
4316 if (sindex != -1)
4317 {
4318 if (p != buff + field_size + 4)
4319 {
4320 if (size < (10 + 2))
4321 abort ();
4322 size -= 2;
4323 *p++ = ',';
4324 *p++ = ' ';
4325 }
4326
4327 size -= flags [sindex].len;
4328 p = stpcpy (p, flags [sindex].str);
4329 }
4330 else if (flag & SHF_MASKOS)
4331 os_flags |= flag;
4332 else if (flag & SHF_MASKPROC)
4333 proc_flags |= flag;
4334 else
4335 unknown_flags |= flag;
4336 }
4337 else
4338 {
4339 switch (flag)
4340 {
4341 case SHF_WRITE: *p = 'W'; break;
4342 case SHF_ALLOC: *p = 'A'; break;
4343 case SHF_EXECINSTR: *p = 'X'; break;
4344 case SHF_MERGE: *p = 'M'; break;
4345 case SHF_STRINGS: *p = 'S'; break;
4346 case SHF_INFO_LINK: *p = 'I'; break;
4347 case SHF_LINK_ORDER: *p = 'L'; break;
4348 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4349 case SHF_GROUP: *p = 'G'; break;
4350 case SHF_TLS: *p = 'T'; break;
4351 case SHF_EXCLUDE: *p = 'E'; break;
4352
4353 default:
4354 if ((elf_header.e_machine == EM_X86_64
4355 || elf_header.e_machine == EM_L1OM)
4356 && flag == SHF_X86_64_LARGE)
4357 *p = 'l';
4358 else if (flag & SHF_MASKOS)
4359 {
4360 *p = 'o';
4361 sh_flags &= ~ SHF_MASKOS;
4362 }
4363 else if (flag & SHF_MASKPROC)
4364 {
4365 *p = 'p';
4366 sh_flags &= ~ SHF_MASKPROC;
4367 }
4368 else
4369 *p = 'x';
4370 break;
4371 }
4372 p++;
4373 }
4374 }
4375
4376 if (do_section_details)
4377 {
4378 if (os_flags)
4379 {
4380 size -= 5 + field_size;
4381 if (p != buff + field_size + 4)
4382 {
4383 if (size < (2 + 1))
4384 abort ();
4385 size -= 2;
4386 *p++ = ',';
4387 *p++ = ' ';
4388 }
4389 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4390 (unsigned long) os_flags);
4391 p += 5 + field_size;
4392 }
4393 if (proc_flags)
4394 {
4395 size -= 7 + field_size;
4396 if (p != buff + field_size + 4)
4397 {
4398 if (size < (2 + 1))
4399 abort ();
4400 size -= 2;
4401 *p++ = ',';
4402 *p++ = ' ';
4403 }
4404 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4405 (unsigned long) proc_flags);
4406 p += 7 + field_size;
4407 }
4408 if (unknown_flags)
4409 {
4410 size -= 10 + field_size;
4411 if (p != buff + field_size + 4)
4412 {
4413 if (size < (2 + 1))
4414 abort ();
4415 size -= 2;
4416 *p++ = ',';
4417 *p++ = ' ';
4418 }
4419 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4420 (unsigned long) unknown_flags);
4421 p += 10 + field_size;
4422 }
4423 }
4424
4425 *p = '\0';
4426 return buff;
4427 }
4428
4429 static int
4430 process_section_headers (FILE * file)
4431 {
4432 Elf_Internal_Shdr * section;
4433 unsigned int i;
4434
4435 section_headers = NULL;
4436
4437 if (elf_header.e_shnum == 0)
4438 {
4439 if (do_sections)
4440 printf (_("\nThere are no sections in this file.\n"));
4441
4442 return 1;
4443 }
4444
4445 if (do_sections && !do_header)
4446 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4447 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4448
4449 if (is_32bit_elf)
4450 {
4451 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4452 return 0;
4453 }
4454 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4455 return 0;
4456
4457 /* Read in the string table, so that we have names to display. */
4458 if (elf_header.e_shstrndx != SHN_UNDEF
4459 && elf_header.e_shstrndx < elf_header.e_shnum)
4460 {
4461 section = section_headers + elf_header.e_shstrndx;
4462
4463 if (section->sh_size != 0)
4464 {
4465 string_table = (char *) get_data (NULL, file, section->sh_offset,
4466 1, section->sh_size,
4467 _("string table"));
4468
4469 string_table_length = string_table != NULL ? section->sh_size : 0;
4470 }
4471 }
4472
4473 /* Scan the sections for the dynamic symbol table
4474 and dynamic string table and debug sections. */
4475 dynamic_symbols = NULL;
4476 dynamic_strings = NULL;
4477 dynamic_syminfo = NULL;
4478 symtab_shndx_hdr = NULL;
4479
4480 eh_addr_size = is_32bit_elf ? 4 : 8;
4481 switch (elf_header.e_machine)
4482 {
4483 case EM_MIPS:
4484 case EM_MIPS_RS3_LE:
4485 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4486 FDE addresses. However, the ABI also has a semi-official ILP32
4487 variant for which the normal FDE address size rules apply.
4488
4489 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4490 section, where XX is the size of longs in bits. Unfortunately,
4491 earlier compilers provided no way of distinguishing ILP32 objects
4492 from LP64 objects, so if there's any doubt, we should assume that
4493 the official LP64 form is being used. */
4494 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4495 && find_section (".gcc_compiled_long32") == NULL)
4496 eh_addr_size = 8;
4497 break;
4498
4499 case EM_H8_300:
4500 case EM_H8_300H:
4501 switch (elf_header.e_flags & EF_H8_MACH)
4502 {
4503 case E_H8_MACH_H8300:
4504 case E_H8_MACH_H8300HN:
4505 case E_H8_MACH_H8300SN:
4506 case E_H8_MACH_H8300SXN:
4507 eh_addr_size = 2;
4508 break;
4509 case E_H8_MACH_H8300H:
4510 case E_H8_MACH_H8300S:
4511 case E_H8_MACH_H8300SX:
4512 eh_addr_size = 4;
4513 break;
4514 }
4515 break;
4516
4517 case EM_M32C_OLD:
4518 case EM_M32C:
4519 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4520 {
4521 case EF_M32C_CPU_M16C:
4522 eh_addr_size = 2;
4523 break;
4524 }
4525 break;
4526 }
4527
4528 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4529 do \
4530 { \
4531 size_t expected_entsize \
4532 = is_32bit_elf ? size32 : size64; \
4533 if (section->sh_entsize != expected_entsize) \
4534 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4535 i, (unsigned long int) section->sh_entsize, \
4536 (unsigned long int) expected_entsize); \
4537 section->sh_entsize = expected_entsize; \
4538 } \
4539 while (0)
4540 #define CHECK_ENTSIZE(section, i, type) \
4541 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4542 sizeof (Elf64_External_##type))
4543
4544 for (i = 0, section = section_headers;
4545 i < elf_header.e_shnum;
4546 i++, section++)
4547 {
4548 char * name = SECTION_NAME (section);
4549
4550 if (section->sh_type == SHT_DYNSYM)
4551 {
4552 if (dynamic_symbols != NULL)
4553 {
4554 error (_("File contains multiple dynamic symbol tables\n"));
4555 continue;
4556 }
4557
4558 CHECK_ENTSIZE (section, i, Sym);
4559 num_dynamic_syms = section->sh_size / section->sh_entsize;
4560 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4561 }
4562 else if (section->sh_type == SHT_STRTAB
4563 && streq (name, ".dynstr"))
4564 {
4565 if (dynamic_strings != NULL)
4566 {
4567 error (_("File contains multiple dynamic string tables\n"));
4568 continue;
4569 }
4570
4571 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4572 1, section->sh_size,
4573 _("dynamic strings"));
4574 dynamic_strings_length = section->sh_size;
4575 }
4576 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4577 {
4578 if (symtab_shndx_hdr != NULL)
4579 {
4580 error (_("File contains multiple symtab shndx tables\n"));
4581 continue;
4582 }
4583 symtab_shndx_hdr = section;
4584 }
4585 else if (section->sh_type == SHT_SYMTAB)
4586 CHECK_ENTSIZE (section, i, Sym);
4587 else if (section->sh_type == SHT_GROUP)
4588 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4589 else if (section->sh_type == SHT_REL)
4590 CHECK_ENTSIZE (section, i, Rel);
4591 else if (section->sh_type == SHT_RELA)
4592 CHECK_ENTSIZE (section, i, Rela);
4593 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4594 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4595 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4596 || do_debug_str || do_debug_loc || do_debug_ranges)
4597 && (const_strneq (name, ".debug_")
4598 || const_strneq (name, ".zdebug_")))
4599 {
4600 if (name[1] == 'z')
4601 name += sizeof (".zdebug_") - 1;
4602 else
4603 name += sizeof (".debug_") - 1;
4604
4605 if (do_debugging
4606 || (do_debug_info && streq (name, "info"))
4607 || (do_debug_info && streq (name, "types"))
4608 || (do_debug_abbrevs && streq (name, "abbrev"))
4609 || (do_debug_lines && streq (name, "line"))
4610 || (do_debug_pubnames && streq (name, "pubnames"))
4611 || (do_debug_pubtypes && streq (name, "pubtypes"))
4612 || (do_debug_aranges && streq (name, "aranges"))
4613 || (do_debug_ranges && streq (name, "ranges"))
4614 || (do_debug_frames && streq (name, "frame"))
4615 || (do_debug_macinfo && streq (name, "macinfo"))
4616 || (do_debug_str && streq (name, "str"))
4617 || (do_debug_loc && streq (name, "loc"))
4618 )
4619 request_dump_bynumber (i, DEBUG_DUMP);
4620 }
4621 /* Linkonce section to be combined with .debug_info at link time. */
4622 else if ((do_debugging || do_debug_info)
4623 && const_strneq (name, ".gnu.linkonce.wi."))
4624 request_dump_bynumber (i, DEBUG_DUMP);
4625 else if (do_debug_frames && streq (name, ".eh_frame"))
4626 request_dump_bynumber (i, DEBUG_DUMP);
4627 /* Trace sections for Itanium VMS. */
4628 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4629 || do_trace_aranges)
4630 && const_strneq (name, ".trace_"))
4631 {
4632 name += sizeof (".trace_") - 1;
4633
4634 if (do_debugging
4635 || (do_trace_info && streq (name, "info"))
4636 || (do_trace_abbrevs && streq (name, "abbrev"))
4637 || (do_trace_aranges && streq (name, "aranges"))
4638 )
4639 request_dump_bynumber (i, DEBUG_DUMP);
4640 }
4641
4642 }
4643
4644 if (! do_sections)
4645 return 1;
4646
4647 if (elf_header.e_shnum > 1)
4648 printf (_("\nSection Headers:\n"));
4649 else
4650 printf (_("\nSection Header:\n"));
4651
4652 if (is_32bit_elf)
4653 {
4654 if (do_section_details)
4655 {
4656 printf (_(" [Nr] Name\n"));
4657 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4658 }
4659 else
4660 printf
4661 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4662 }
4663 else if (do_wide)
4664 {
4665 if (do_section_details)
4666 {
4667 printf (_(" [Nr] Name\n"));
4668 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4669 }
4670 else
4671 printf
4672 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4673 }
4674 else
4675 {
4676 if (do_section_details)
4677 {
4678 printf (_(" [Nr] Name\n"));
4679 printf (_(" Type Address Offset Link\n"));
4680 printf (_(" Size EntSize Info Align\n"));
4681 }
4682 else
4683 {
4684 printf (_(" [Nr] Name Type Address Offset\n"));
4685 printf (_(" Size EntSize Flags Link Info Align\n"));
4686 }
4687 }
4688
4689 if (do_section_details)
4690 printf (_(" Flags\n"));
4691
4692 for (i = 0, section = section_headers;
4693 i < elf_header.e_shnum;
4694 i++, section++)
4695 {
4696 if (do_section_details)
4697 {
4698 printf (" [%2u] %s\n",
4699 i,
4700 SECTION_NAME (section));
4701 if (is_32bit_elf || do_wide)
4702 printf (" %-15.15s ",
4703 get_section_type_name (section->sh_type));
4704 }
4705 else
4706 printf ((do_wide ? " [%2u] %-17s %-15s "
4707 : " [%2u] %-17.17s %-15.15s "),
4708 i,
4709 SECTION_NAME (section),
4710 get_section_type_name (section->sh_type));
4711
4712 if (is_32bit_elf)
4713 {
4714 const char * link_too_big = NULL;
4715
4716 print_vma (section->sh_addr, LONG_HEX);
4717
4718 printf ( " %6.6lx %6.6lx %2.2lx",
4719 (unsigned long) section->sh_offset,
4720 (unsigned long) section->sh_size,
4721 (unsigned long) section->sh_entsize);
4722
4723 if (do_section_details)
4724 fputs (" ", stdout);
4725 else
4726 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4727
4728 if (section->sh_link >= elf_header.e_shnum)
4729 {
4730 link_too_big = "";
4731 /* The sh_link value is out of range. Normally this indicates
4732 an error but it can have special values in Solaris binaries. */
4733 switch (elf_header.e_machine)
4734 {
4735 case EM_386:
4736 case EM_486:
4737 case EM_X86_64:
4738 case EM_L1OM:
4739 case EM_OLD_SPARCV9:
4740 case EM_SPARC32PLUS:
4741 case EM_SPARCV9:
4742 case EM_SPARC:
4743 if (section->sh_link == (SHN_BEFORE & 0xffff))
4744 link_too_big = "BEFORE";
4745 else if (section->sh_link == (SHN_AFTER & 0xffff))
4746 link_too_big = "AFTER";
4747 break;
4748 default:
4749 break;
4750 }
4751 }
4752
4753 if (do_section_details)
4754 {
4755 if (link_too_big != NULL && * link_too_big)
4756 printf ("<%s> ", link_too_big);
4757 else
4758 printf ("%2u ", section->sh_link);
4759 printf ("%3u %2lu\n", section->sh_info,
4760 (unsigned long) section->sh_addralign);
4761 }
4762 else
4763 printf ("%2u %3u %2lu\n",
4764 section->sh_link,
4765 section->sh_info,
4766 (unsigned long) section->sh_addralign);
4767
4768 if (link_too_big && ! * link_too_big)
4769 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4770 i, section->sh_link);
4771 }
4772 else if (do_wide)
4773 {
4774 print_vma (section->sh_addr, LONG_HEX);
4775
4776 if ((long) section->sh_offset == section->sh_offset)
4777 printf (" %6.6lx", (unsigned long) section->sh_offset);
4778 else
4779 {
4780 putchar (' ');
4781 print_vma (section->sh_offset, LONG_HEX);
4782 }
4783
4784 if ((unsigned long) section->sh_size == section->sh_size)
4785 printf (" %6.6lx", (unsigned long) section->sh_size);
4786 else
4787 {
4788 putchar (' ');
4789 print_vma (section->sh_size, LONG_HEX);
4790 }
4791
4792 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4793 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4794 else
4795 {
4796 putchar (' ');
4797 print_vma (section->sh_entsize, LONG_HEX);
4798 }
4799
4800 if (do_section_details)
4801 fputs (" ", stdout);
4802 else
4803 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4804
4805 printf ("%2u %3u ", section->sh_link, section->sh_info);
4806
4807 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4808 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4809 else
4810 {
4811 print_vma (section->sh_addralign, DEC);
4812 putchar ('\n');
4813 }
4814 }
4815 else if (do_section_details)
4816 {
4817 printf (" %-15.15s ",
4818 get_section_type_name (section->sh_type));
4819 print_vma (section->sh_addr, LONG_HEX);
4820 if ((long) section->sh_offset == section->sh_offset)
4821 printf (" %16.16lx", (unsigned long) section->sh_offset);
4822 else
4823 {
4824 printf (" ");
4825 print_vma (section->sh_offset, LONG_HEX);
4826 }
4827 printf (" %u\n ", section->sh_link);
4828 print_vma (section->sh_size, LONG_HEX);
4829 putchar (' ');
4830 print_vma (section->sh_entsize, LONG_HEX);
4831
4832 printf (" %-16u %lu\n",
4833 section->sh_info,
4834 (unsigned long) section->sh_addralign);
4835 }
4836 else
4837 {
4838 putchar (' ');
4839 print_vma (section->sh_addr, LONG_HEX);
4840 if ((long) section->sh_offset == section->sh_offset)
4841 printf (" %8.8lx", (unsigned long) section->sh_offset);
4842 else
4843 {
4844 printf (" ");
4845 print_vma (section->sh_offset, LONG_HEX);
4846 }
4847 printf ("\n ");
4848 print_vma (section->sh_size, LONG_HEX);
4849 printf (" ");
4850 print_vma (section->sh_entsize, LONG_HEX);
4851
4852 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4853
4854 printf (" %2u %3u %lu\n",
4855 section->sh_link,
4856 section->sh_info,
4857 (unsigned long) section->sh_addralign);
4858 }
4859
4860 if (do_section_details)
4861 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4862 }
4863
4864 if (!do_section_details)
4865 {
4866 if (elf_header.e_machine == EM_X86_64
4867 || elf_header.e_machine == EM_L1OM)
4868 printf (_("Key to Flags:\n\
4869 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4870 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4871 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4872 else
4873 printf (_("Key to Flags:\n\
4874 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4875 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4876 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4877 }
4878
4879 return 1;
4880 }
4881
4882 static const char *
4883 get_group_flags (unsigned int flags)
4884 {
4885 static char buff[32];
4886 switch (flags)
4887 {
4888 case 0:
4889 return "";
4890
4891 case GRP_COMDAT:
4892 return "COMDAT ";
4893
4894 default:
4895 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
4896 break;
4897 }
4898 return buff;
4899 }
4900
4901 static int
4902 process_section_groups (FILE * file)
4903 {
4904 Elf_Internal_Shdr * section;
4905 unsigned int i;
4906 struct group * group;
4907 Elf_Internal_Shdr * symtab_sec;
4908 Elf_Internal_Shdr * strtab_sec;
4909 Elf_Internal_Sym * symtab;
4910 char * strtab;
4911 size_t strtab_size;
4912
4913 /* Don't process section groups unless needed. */
4914 if (!do_unwind && !do_section_groups)
4915 return 1;
4916
4917 if (elf_header.e_shnum == 0)
4918 {
4919 if (do_section_groups)
4920 printf (_("\nThere are no sections in this file.\n"));
4921
4922 return 1;
4923 }
4924
4925 if (section_headers == NULL)
4926 {
4927 error (_("Section headers are not available!\n"));
4928 abort ();
4929 }
4930
4931 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
4932 sizeof (struct group *));
4933
4934 if (section_headers_groups == NULL)
4935 {
4936 error (_("Out of memory\n"));
4937 return 0;
4938 }
4939
4940 /* Scan the sections for the group section. */
4941 group_count = 0;
4942 for (i = 0, section = section_headers;
4943 i < elf_header.e_shnum;
4944 i++, section++)
4945 if (section->sh_type == SHT_GROUP)
4946 group_count++;
4947
4948 if (group_count == 0)
4949 {
4950 if (do_section_groups)
4951 printf (_("\nThere are no section groups in this file.\n"));
4952
4953 return 1;
4954 }
4955
4956 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
4957
4958 if (section_groups == NULL)
4959 {
4960 error (_("Out of memory\n"));
4961 return 0;
4962 }
4963
4964 symtab_sec = NULL;
4965 strtab_sec = NULL;
4966 symtab = NULL;
4967 strtab = NULL;
4968 strtab_size = 0;
4969 for (i = 0, section = section_headers, group = section_groups;
4970 i < elf_header.e_shnum;
4971 i++, section++)
4972 {
4973 if (section->sh_type == SHT_GROUP)
4974 {
4975 char * name = SECTION_NAME (section);
4976 char * group_name;
4977 unsigned char * start;
4978 unsigned char * indices;
4979 unsigned int entry, j, size;
4980 Elf_Internal_Shdr * sec;
4981 Elf_Internal_Sym * sym;
4982
4983 /* Get the symbol table. */
4984 if (section->sh_link >= elf_header.e_shnum
4985 || ((sec = section_headers + section->sh_link)->sh_type
4986 != SHT_SYMTAB))
4987 {
4988 error (_("Bad sh_link in group section `%s'\n"), name);
4989 continue;
4990 }
4991
4992 if (symtab_sec != sec)
4993 {
4994 symtab_sec = sec;
4995 if (symtab)
4996 free (symtab);
4997 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4998 }
4999
5000 if (symtab == NULL)
5001 {
5002 error (_("Corrupt header in group section `%s'\n"), name);
5003 continue;
5004 }
5005
5006 sym = symtab + section->sh_info;
5007
5008 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5009 {
5010 if (sym->st_shndx == 0
5011 || sym->st_shndx >= elf_header.e_shnum)
5012 {
5013 error (_("Bad sh_info in group section `%s'\n"), name);
5014 continue;
5015 }
5016
5017 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5018 strtab_sec = NULL;
5019 if (strtab)
5020 free (strtab);
5021 strtab = NULL;
5022 strtab_size = 0;
5023 }
5024 else
5025 {
5026 /* Get the string table. */
5027 if (symtab_sec->sh_link >= elf_header.e_shnum)
5028 {
5029 strtab_sec = NULL;
5030 if (strtab)
5031 free (strtab);
5032 strtab = NULL;
5033 strtab_size = 0;
5034 }
5035 else if (strtab_sec
5036 != (sec = section_headers + symtab_sec->sh_link))
5037 {
5038 strtab_sec = sec;
5039 if (strtab)
5040 free (strtab);
5041 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5042 1, strtab_sec->sh_size,
5043 _("string table"));
5044 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5045 }
5046 group_name = sym->st_name < strtab_size
5047 ? strtab + sym->st_name : _("<corrupt>");
5048 }
5049
5050 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5051 1, section->sh_size,
5052 _("section data"));
5053
5054 indices = start;
5055 size = (section->sh_size / section->sh_entsize) - 1;
5056 entry = byte_get (indices, 4);
5057 indices += 4;
5058
5059 if (do_section_groups)
5060 {
5061 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5062 get_group_flags (entry), i, name, group_name, size);
5063
5064 printf (_(" [Index] Name\n"));
5065 }
5066
5067 group->group_index = i;
5068
5069 for (j = 0; j < size; j++)
5070 {
5071 struct group_list * g;
5072
5073 entry = byte_get (indices, 4);
5074 indices += 4;
5075
5076 if (entry >= elf_header.e_shnum)
5077 {
5078 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5079 entry, i, elf_header.e_shnum - 1);
5080 continue;
5081 }
5082
5083 if (section_headers_groups [entry] != NULL)
5084 {
5085 if (entry)
5086 {
5087 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5088 entry, i,
5089 section_headers_groups [entry]->group_index);
5090 continue;
5091 }
5092 else
5093 {
5094 /* Intel C/C++ compiler may put section 0 in a
5095 section group. We just warn it the first time
5096 and ignore it afterwards. */
5097 static int warned = 0;
5098 if (!warned)
5099 {
5100 error (_("section 0 in group section [%5u]\n"),
5101 section_headers_groups [entry]->group_index);
5102 warned++;
5103 }
5104 }
5105 }
5106
5107 section_headers_groups [entry] = group;
5108
5109 if (do_section_groups)
5110 {
5111 sec = section_headers + entry;
5112 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5113 }
5114
5115 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5116 g->section_index = entry;
5117 g->next = group->root;
5118 group->root = g;
5119 }
5120
5121 if (start)
5122 free (start);
5123
5124 group++;
5125 }
5126 }
5127
5128 if (symtab)
5129 free (symtab);
5130 if (strtab)
5131 free (strtab);
5132 return 1;
5133 }
5134
5135 /* Data used to display dynamic fixups. */
5136
5137 struct ia64_vms_dynfixup
5138 {
5139 bfd_vma needed_ident; /* Library ident number. */
5140 bfd_vma needed; /* Index in the dstrtab of the library name. */
5141 bfd_vma fixup_needed; /* Index of the library. */
5142 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5143 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5144 };
5145
5146 /* Data used to display dynamic relocations. */
5147
5148 struct ia64_vms_dynimgrela
5149 {
5150 bfd_vma img_rela_cnt; /* Number of relocations. */
5151 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5152 };
5153
5154 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5155 library). */
5156
5157 static void
5158 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5159 const char *strtab, unsigned int strtab_sz)
5160 {
5161 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5162 long i;
5163 const char *lib_name;
5164
5165 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5166 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5167 _("dynamic section image fixups"));
5168 if (!imfs)
5169 return;
5170
5171 if (fixup->needed < strtab_sz)
5172 lib_name = strtab + fixup->needed;
5173 else
5174 {
5175 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5176 (unsigned long) fixup->needed);
5177 lib_name = "???";
5178 }
5179 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5180 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5181 printf
5182 (_("Seg Offset Type SymVec DataType\n"));
5183
5184 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5185 {
5186 unsigned int type;
5187 const char *rtype;
5188
5189 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5190 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5191 type = BYTE_GET (imfs [i].type);
5192 rtype = elf_ia64_reloc_type (type);
5193 if (rtype == NULL)
5194 printf (" 0x%08x ", type);
5195 else
5196 printf (" %-32s ", rtype);
5197 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5198 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5199 }
5200
5201 free (imfs);
5202 }
5203
5204 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5205
5206 static void
5207 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5208 {
5209 Elf64_External_VMS_IMAGE_RELA *imrs;
5210 long i;
5211
5212 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5213 1, imgrela->img_rela_cnt * sizeof (*imrs),
5214 _("dynamic section image relas"));
5215 if (!imrs)
5216 return;
5217
5218 printf (_("\nImage relocs\n"));
5219 printf
5220 (_("Seg Offset Type Addend Seg Sym Off\n"));
5221
5222 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5223 {
5224 unsigned int type;
5225 const char *rtype;
5226
5227 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5228 printf ("%08" BFD_VMA_FMT "x ",
5229 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5230 type = BYTE_GET (imrs [i].type);
5231 rtype = elf_ia64_reloc_type (type);
5232 if (rtype == NULL)
5233 printf ("0x%08x ", type);
5234 else
5235 printf ("%-31s ", rtype);
5236 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5237 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5238 printf ("%08" BFD_VMA_FMT "x\n",
5239 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5240 }
5241
5242 free (imrs);
5243 }
5244
5245 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5246
5247 static int
5248 process_ia64_vms_dynamic_relocs (FILE *file)
5249 {
5250 struct ia64_vms_dynfixup fixup;
5251 struct ia64_vms_dynimgrela imgrela;
5252 Elf_Internal_Dyn *entry;
5253 int res = 0;
5254 bfd_vma strtab_off = 0;
5255 bfd_vma strtab_sz = 0;
5256 char *strtab = NULL;
5257
5258 memset (&fixup, 0, sizeof (fixup));
5259 memset (&imgrela, 0, sizeof (imgrela));
5260
5261 /* Note: the order of the entries is specified by the OpenVMS specs. */
5262 for (entry = dynamic_section;
5263 entry < dynamic_section + dynamic_nent;
5264 entry++)
5265 {
5266 switch (entry->d_tag)
5267 {
5268 case DT_IA_64_VMS_STRTAB_OFFSET:
5269 strtab_off = entry->d_un.d_val;
5270 break;
5271 case DT_STRSZ:
5272 strtab_sz = entry->d_un.d_val;
5273 if (strtab == NULL)
5274 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5275 1, strtab_sz, _("dynamic string section"));
5276 break;
5277
5278 case DT_IA_64_VMS_NEEDED_IDENT:
5279 fixup.needed_ident = entry->d_un.d_val;
5280 break;
5281 case DT_NEEDED:
5282 fixup.needed = entry->d_un.d_val;
5283 break;
5284 case DT_IA_64_VMS_FIXUP_NEEDED:
5285 fixup.fixup_needed = entry->d_un.d_val;
5286 break;
5287 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5288 fixup.fixup_rela_cnt = entry->d_un.d_val;
5289 break;
5290 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5291 fixup.fixup_rela_off = entry->d_un.d_val;
5292 res++;
5293 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5294 break;
5295
5296 case DT_IA_64_VMS_IMG_RELA_CNT:
5297 imgrela.img_rela_cnt = entry->d_un.d_val;
5298 break;
5299 case DT_IA_64_VMS_IMG_RELA_OFF:
5300 imgrela.img_rela_off = entry->d_un.d_val;
5301 res++;
5302 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5303 break;
5304
5305 default:
5306 break;
5307 }
5308 }
5309
5310 if (strtab != NULL)
5311 free (strtab);
5312
5313 return res;
5314 }
5315
5316 static struct
5317 {
5318 const char * name;
5319 int reloc;
5320 int size;
5321 int rela;
5322 } dynamic_relocations [] =
5323 {
5324 { "REL", DT_REL, DT_RELSZ, FALSE },
5325 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5326 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5327 };
5328
5329 /* Process the reloc section. */
5330
5331 static int
5332 process_relocs (FILE * file)
5333 {
5334 unsigned long rel_size;
5335 unsigned long rel_offset;
5336
5337
5338 if (!do_reloc)
5339 return 1;
5340
5341 if (do_using_dynamic)
5342 {
5343 int is_rela;
5344 const char * name;
5345 int has_dynamic_reloc;
5346 unsigned int i;
5347
5348 has_dynamic_reloc = 0;
5349
5350 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5351 {
5352 is_rela = dynamic_relocations [i].rela;
5353 name = dynamic_relocations [i].name;
5354 rel_size = dynamic_info [dynamic_relocations [i].size];
5355 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5356
5357 has_dynamic_reloc |= rel_size;
5358
5359 if (is_rela == UNKNOWN)
5360 {
5361 if (dynamic_relocations [i].reloc == DT_JMPREL)
5362 switch (dynamic_info[DT_PLTREL])
5363 {
5364 case DT_REL:
5365 is_rela = FALSE;
5366 break;
5367 case DT_RELA:
5368 is_rela = TRUE;
5369 break;
5370 }
5371 }
5372
5373 if (rel_size)
5374 {
5375 printf
5376 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5377 name, rel_offset, rel_size);
5378
5379 dump_relocations (file,
5380 offset_from_vma (file, rel_offset, rel_size),
5381 rel_size,
5382 dynamic_symbols, num_dynamic_syms,
5383 dynamic_strings, dynamic_strings_length, is_rela);
5384 }
5385 }
5386
5387 if (is_ia64_vms ())
5388 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5389
5390 if (! has_dynamic_reloc)
5391 printf (_("\nThere are no dynamic relocations in this file.\n"));
5392 }
5393 else
5394 {
5395 Elf_Internal_Shdr * section;
5396 unsigned long i;
5397 int found = 0;
5398
5399 for (i = 0, section = section_headers;
5400 i < elf_header.e_shnum;
5401 i++, section++)
5402 {
5403 if ( section->sh_type != SHT_RELA
5404 && section->sh_type != SHT_REL)
5405 continue;
5406
5407 rel_offset = section->sh_offset;
5408 rel_size = section->sh_size;
5409
5410 if (rel_size)
5411 {
5412 Elf_Internal_Shdr * strsec;
5413 int is_rela;
5414
5415 printf (_("\nRelocation section "));
5416
5417 if (string_table == NULL)
5418 printf ("%d", section->sh_name);
5419 else
5420 printf (_("'%s'"), SECTION_NAME (section));
5421
5422 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5423 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5424
5425 is_rela = section->sh_type == SHT_RELA;
5426
5427 if (section->sh_link != 0
5428 && section->sh_link < elf_header.e_shnum)
5429 {
5430 Elf_Internal_Shdr * symsec;
5431 Elf_Internal_Sym * symtab;
5432 unsigned long nsyms;
5433 unsigned long strtablen = 0;
5434 char * strtab = NULL;
5435
5436 symsec = section_headers + section->sh_link;
5437 if (symsec->sh_type != SHT_SYMTAB
5438 && symsec->sh_type != SHT_DYNSYM)
5439 continue;
5440
5441 nsyms = symsec->sh_size / symsec->sh_entsize;
5442 symtab = GET_ELF_SYMBOLS (file, symsec);
5443
5444 if (symtab == NULL)
5445 continue;
5446
5447 if (symsec->sh_link != 0
5448 && symsec->sh_link < elf_header.e_shnum)
5449 {
5450 strsec = section_headers + symsec->sh_link;
5451
5452 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5453 1, strsec->sh_size,
5454 _("string table"));
5455 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5456 }
5457
5458 dump_relocations (file, rel_offset, rel_size,
5459 symtab, nsyms, strtab, strtablen, is_rela);
5460 if (strtab)
5461 free (strtab);
5462 free (symtab);
5463 }
5464 else
5465 dump_relocations (file, rel_offset, rel_size,
5466 NULL, 0, NULL, 0, is_rela);
5467
5468 found = 1;
5469 }
5470 }
5471
5472 if (! found)
5473 printf (_("\nThere are no relocations in this file.\n"));
5474 }
5475
5476 return 1;
5477 }
5478
5479 /* Process the unwind section. */
5480
5481 #include "unwind-ia64.h"
5482
5483 /* An absolute address consists of a section and an offset. If the
5484 section is NULL, the offset itself is the address, otherwise, the
5485 address equals to LOAD_ADDRESS(section) + offset. */
5486
5487 struct absaddr
5488 {
5489 unsigned short section;
5490 bfd_vma offset;
5491 };
5492
5493 #define ABSADDR(a) \
5494 ((a).section \
5495 ? section_headers [(a).section].sh_addr + (a).offset \
5496 : (a).offset)
5497
5498 struct ia64_unw_table_entry
5499 {
5500 struct absaddr start;
5501 struct absaddr end;
5502 struct absaddr info;
5503 };
5504
5505 struct ia64_unw_aux_info
5506 {
5507
5508 struct ia64_unw_table_entry *table; /* Unwind table. */
5509 unsigned long table_len; /* Length of unwind table. */
5510 unsigned char * info; /* Unwind info. */
5511 unsigned long info_size; /* Size of unwind info. */
5512 bfd_vma info_addr; /* starting address of unwind info. */
5513 bfd_vma seg_base; /* Starting address of segment. */
5514 Elf_Internal_Sym * symtab; /* The symbol table. */
5515 unsigned long nsyms; /* Number of symbols. */
5516 char * strtab; /* The string table. */
5517 unsigned long strtab_size; /* Size of string table. */
5518 };
5519
5520 static void
5521 find_symbol_for_address (Elf_Internal_Sym * symtab,
5522 unsigned long nsyms,
5523 const char * strtab,
5524 unsigned long strtab_size,
5525 struct absaddr addr,
5526 const char ** symname,
5527 bfd_vma * offset)
5528 {
5529 bfd_vma dist = 0x100000;
5530 Elf_Internal_Sym * sym;
5531 Elf_Internal_Sym * best = NULL;
5532 unsigned long i;
5533
5534 REMOVE_ARCH_BITS (addr.offset);
5535
5536 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5537 {
5538 bfd_vma value = sym->st_value;
5539
5540 REMOVE_ARCH_BITS (value);
5541
5542 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5543 && sym->st_name != 0
5544 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5545 && addr.offset >= value
5546 && addr.offset - value < dist)
5547 {
5548 best = sym;
5549 dist = addr.offset - value;
5550 if (!dist)
5551 break;
5552 }
5553 }
5554 if (best)
5555 {
5556 *symname = (best->st_name >= strtab_size
5557 ? _("<corrupt>") : strtab + best->st_name);
5558 *offset = dist;
5559 return;
5560 }
5561 *symname = NULL;
5562 *offset = addr.offset;
5563 }
5564
5565 static void
5566 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5567 {
5568 struct ia64_unw_table_entry * tp;
5569 int in_body;
5570
5571 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5572 {
5573 bfd_vma stamp;
5574 bfd_vma offset;
5575 const unsigned char * dp;
5576 const unsigned char * head;
5577 const char * procname;
5578
5579 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5580 aux->strtab_size, tp->start, &procname, &offset);
5581
5582 fputs ("\n<", stdout);
5583
5584 if (procname)
5585 {
5586 fputs (procname, stdout);
5587
5588 if (offset)
5589 printf ("+%lx", (unsigned long) offset);
5590 }
5591
5592 fputs (">: [", stdout);
5593 print_vma (tp->start.offset, PREFIX_HEX);
5594 fputc ('-', stdout);
5595 print_vma (tp->end.offset, PREFIX_HEX);
5596 printf ("], info at +0x%lx\n",
5597 (unsigned long) (tp->info.offset - aux->seg_base));
5598
5599 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5600 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5601
5602 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5603 (unsigned) UNW_VER (stamp),
5604 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5605 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5606 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5607 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5608
5609 if (UNW_VER (stamp) != 1)
5610 {
5611 printf (_("\tUnknown version.\n"));
5612 continue;
5613 }
5614
5615 in_body = 0;
5616 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5617 dp = unw_decode (dp, in_body, & in_body);
5618 }
5619 }
5620
5621 static int
5622 slurp_ia64_unwind_table (FILE * file,
5623 struct ia64_unw_aux_info * aux,
5624 Elf_Internal_Shdr * sec)
5625 {
5626 unsigned long size, nrelas, i;
5627 Elf_Internal_Phdr * seg;
5628 struct ia64_unw_table_entry * tep;
5629 Elf_Internal_Shdr * relsec;
5630 Elf_Internal_Rela * rela;
5631 Elf_Internal_Rela * rp;
5632 unsigned char * table;
5633 unsigned char * tp;
5634 Elf_Internal_Sym * sym;
5635 const char * relname;
5636
5637 /* First, find the starting address of the segment that includes
5638 this section: */
5639
5640 if (elf_header.e_phnum)
5641 {
5642 if (! get_program_headers (file))
5643 return 0;
5644
5645 for (seg = program_headers;
5646 seg < program_headers + elf_header.e_phnum;
5647 ++seg)
5648 {
5649 if (seg->p_type != PT_LOAD)
5650 continue;
5651
5652 if (sec->sh_addr >= seg->p_vaddr
5653 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5654 {
5655 aux->seg_base = seg->p_vaddr;
5656 break;
5657 }
5658 }
5659 }
5660
5661 /* Second, build the unwind table from the contents of the unwind section: */
5662 size = sec->sh_size;
5663 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5664 _("unwind table"));
5665 if (!table)
5666 return 0;
5667
5668 aux->table = (struct ia64_unw_table_entry *)
5669 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5670 tep = aux->table;
5671 for (tp = table; tp < table + size; ++tep)
5672 {
5673 tep->start.section = SHN_UNDEF;
5674 tep->end.section = SHN_UNDEF;
5675 tep->info.section = SHN_UNDEF;
5676 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5677 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5678 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5679 tep->start.offset += aux->seg_base;
5680 tep->end.offset += aux->seg_base;
5681 tep->info.offset += aux->seg_base;
5682 }
5683 free (table);
5684
5685 /* Third, apply any relocations to the unwind table: */
5686 for (relsec = section_headers;
5687 relsec < section_headers + elf_header.e_shnum;
5688 ++relsec)
5689 {
5690 if (relsec->sh_type != SHT_RELA
5691 || relsec->sh_info >= elf_header.e_shnum
5692 || section_headers + relsec->sh_info != sec)
5693 continue;
5694
5695 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5696 & rela, & nrelas))
5697 return 0;
5698
5699 for (rp = rela; rp < rela + nrelas; ++rp)
5700 {
5701 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5702 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5703
5704 if (! const_strneq (relname, "R_IA64_SEGREL"))
5705 {
5706 warn (_("Skipping unexpected relocation type %s\n"), relname);
5707 continue;
5708 }
5709
5710 i = rp->r_offset / (3 * eh_addr_size);
5711
5712 switch (rp->r_offset/eh_addr_size % 3)
5713 {
5714 case 0:
5715 aux->table[i].start.section = sym->st_shndx;
5716 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5717 break;
5718 case 1:
5719 aux->table[i].end.section = sym->st_shndx;
5720 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5721 break;
5722 case 2:
5723 aux->table[i].info.section = sym->st_shndx;
5724 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5725 break;
5726 default:
5727 break;
5728 }
5729 }
5730
5731 free (rela);
5732 }
5733
5734 aux->table_len = size / (3 * eh_addr_size);
5735 return 1;
5736 }
5737
5738 static int
5739 ia64_process_unwind (FILE * file)
5740 {
5741 Elf_Internal_Shdr * sec;
5742 Elf_Internal_Shdr * unwsec = NULL;
5743 Elf_Internal_Shdr * strsec;
5744 unsigned long i, unwcount = 0, unwstart = 0;
5745 struct ia64_unw_aux_info aux;
5746
5747 memset (& aux, 0, sizeof (aux));
5748
5749 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5750 {
5751 if (sec->sh_type == SHT_SYMTAB
5752 && sec->sh_link < elf_header.e_shnum)
5753 {
5754 aux.nsyms = sec->sh_size / sec->sh_entsize;
5755 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5756
5757 strsec = section_headers + sec->sh_link;
5758 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5759 1, strsec->sh_size,
5760 _("string table"));
5761 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5762 }
5763 else if (sec->sh_type == SHT_IA_64_UNWIND)
5764 unwcount++;
5765 }
5766
5767 if (!unwcount)
5768 printf (_("\nThere are no unwind sections in this file.\n"));
5769
5770 while (unwcount-- > 0)
5771 {
5772 char * suffix;
5773 size_t len, len2;
5774
5775 for (i = unwstart, sec = section_headers + unwstart;
5776 i < elf_header.e_shnum; ++i, ++sec)
5777 if (sec->sh_type == SHT_IA_64_UNWIND)
5778 {
5779 unwsec = sec;
5780 break;
5781 }
5782
5783 unwstart = i + 1;
5784 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5785
5786 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5787 {
5788 /* We need to find which section group it is in. */
5789 struct group_list * g = section_headers_groups [i]->root;
5790
5791 for (; g != NULL; g = g->next)
5792 {
5793 sec = section_headers + g->section_index;
5794
5795 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5796 break;
5797 }
5798
5799 if (g == NULL)
5800 i = elf_header.e_shnum;
5801 }
5802 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5803 {
5804 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5805 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5806 suffix = SECTION_NAME (unwsec) + len;
5807 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5808 ++i, ++sec)
5809 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5810 && streq (SECTION_NAME (sec) + len2, suffix))
5811 break;
5812 }
5813 else
5814 {
5815 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5816 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5817 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5818 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5819 suffix = "";
5820 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5821 suffix = SECTION_NAME (unwsec) + len;
5822 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5823 ++i, ++sec)
5824 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5825 && streq (SECTION_NAME (sec) + len2, suffix))
5826 break;
5827 }
5828
5829 if (i == elf_header.e_shnum)
5830 {
5831 printf (_("\nCould not find unwind info section for "));
5832
5833 if (string_table == NULL)
5834 printf ("%d", unwsec->sh_name);
5835 else
5836 printf (_("'%s'"), SECTION_NAME (unwsec));
5837 }
5838 else
5839 {
5840 aux.info_size = sec->sh_size;
5841 aux.info_addr = sec->sh_addr;
5842 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5843 aux.info_size,
5844 _("unwind info"));
5845
5846 printf (_("\nUnwind section "));
5847
5848 if (string_table == NULL)
5849 printf ("%d", unwsec->sh_name);
5850 else
5851 printf (_("'%s'"), SECTION_NAME (unwsec));
5852
5853 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5854 (unsigned long) unwsec->sh_offset,
5855 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5856
5857 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5858
5859 if (aux.table_len > 0)
5860 dump_ia64_unwind (& aux);
5861
5862 if (aux.table)
5863 free ((char *) aux.table);
5864 if (aux.info)
5865 free ((char *) aux.info);
5866 aux.table = NULL;
5867 aux.info = NULL;
5868 }
5869 }
5870
5871 if (aux.symtab)
5872 free (aux.symtab);
5873 if (aux.strtab)
5874 free ((char *) aux.strtab);
5875
5876 return 1;
5877 }
5878
5879 struct hppa_unw_table_entry
5880 {
5881 struct absaddr start;
5882 struct absaddr end;
5883 unsigned int Cannot_unwind:1; /* 0 */
5884 unsigned int Millicode:1; /* 1 */
5885 unsigned int Millicode_save_sr0:1; /* 2 */
5886 unsigned int Region_description:2; /* 3..4 */
5887 unsigned int reserved1:1; /* 5 */
5888 unsigned int Entry_SR:1; /* 6 */
5889 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5890 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5891 unsigned int Args_stored:1; /* 16 */
5892 unsigned int Variable_Frame:1; /* 17 */
5893 unsigned int Separate_Package_Body:1; /* 18 */
5894 unsigned int Frame_Extension_Millicode:1; /* 19 */
5895 unsigned int Stack_Overflow_Check:1; /* 20 */
5896 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5897 unsigned int Ada_Region:1; /* 22 */
5898 unsigned int cxx_info:1; /* 23 */
5899 unsigned int cxx_try_catch:1; /* 24 */
5900 unsigned int sched_entry_seq:1; /* 25 */
5901 unsigned int reserved2:1; /* 26 */
5902 unsigned int Save_SP:1; /* 27 */
5903 unsigned int Save_RP:1; /* 28 */
5904 unsigned int Save_MRP_in_frame:1; /* 29 */
5905 unsigned int extn_ptr_defined:1; /* 30 */
5906 unsigned int Cleanup_defined:1; /* 31 */
5907
5908 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5909 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5910 unsigned int Large_frame:1; /* 2 */
5911 unsigned int Pseudo_SP_Set:1; /* 3 */
5912 unsigned int reserved4:1; /* 4 */
5913 unsigned int Total_frame_size:27; /* 5..31 */
5914 };
5915
5916 struct hppa_unw_aux_info
5917 {
5918 struct hppa_unw_table_entry *table; /* Unwind table. */
5919 unsigned long table_len; /* Length of unwind table. */
5920 bfd_vma seg_base; /* Starting address of segment. */
5921 Elf_Internal_Sym * symtab; /* The symbol table. */
5922 unsigned long nsyms; /* Number of symbols. */
5923 char * strtab; /* The string table. */
5924 unsigned long strtab_size; /* Size of string table. */
5925 };
5926
5927 static void
5928 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
5929 {
5930 struct hppa_unw_table_entry * tp;
5931
5932 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5933 {
5934 bfd_vma offset;
5935 const char * procname;
5936
5937 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5938 aux->strtab_size, tp->start, &procname,
5939 &offset);
5940
5941 fputs ("\n<", stdout);
5942
5943 if (procname)
5944 {
5945 fputs (procname, stdout);
5946
5947 if (offset)
5948 printf ("+%lx", (unsigned long) offset);
5949 }
5950
5951 fputs (">: [", stdout);
5952 print_vma (tp->start.offset, PREFIX_HEX);
5953 fputc ('-', stdout);
5954 print_vma (tp->end.offset, PREFIX_HEX);
5955 printf ("]\n\t");
5956
5957 #define PF(_m) if (tp->_m) printf (#_m " ");
5958 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5959 PF(Cannot_unwind);
5960 PF(Millicode);
5961 PF(Millicode_save_sr0);
5962 /* PV(Region_description); */
5963 PF(Entry_SR);
5964 PV(Entry_FR);
5965 PV(Entry_GR);
5966 PF(Args_stored);
5967 PF(Variable_Frame);
5968 PF(Separate_Package_Body);
5969 PF(Frame_Extension_Millicode);
5970 PF(Stack_Overflow_Check);
5971 PF(Two_Instruction_SP_Increment);
5972 PF(Ada_Region);
5973 PF(cxx_info);
5974 PF(cxx_try_catch);
5975 PF(sched_entry_seq);
5976 PF(Save_SP);
5977 PF(Save_RP);
5978 PF(Save_MRP_in_frame);
5979 PF(extn_ptr_defined);
5980 PF(Cleanup_defined);
5981 PF(MPE_XL_interrupt_marker);
5982 PF(HP_UX_interrupt_marker);
5983 PF(Large_frame);
5984 PF(Pseudo_SP_Set);
5985 PV(Total_frame_size);
5986 #undef PF
5987 #undef PV
5988 }
5989
5990 printf ("\n");
5991 }
5992
5993 static int
5994 slurp_hppa_unwind_table (FILE * file,
5995 struct hppa_unw_aux_info * aux,
5996 Elf_Internal_Shdr * sec)
5997 {
5998 unsigned long size, unw_ent_size, nentries, nrelas, i;
5999 Elf_Internal_Phdr * seg;
6000 struct hppa_unw_table_entry * tep;
6001 Elf_Internal_Shdr * relsec;
6002 Elf_Internal_Rela * rela;
6003 Elf_Internal_Rela * rp;
6004 unsigned char * table;
6005 unsigned char * tp;
6006 Elf_Internal_Sym * sym;
6007 const char * relname;
6008
6009 /* First, find the starting address of the segment that includes
6010 this section. */
6011
6012 if (elf_header.e_phnum)
6013 {
6014 if (! get_program_headers (file))
6015 return 0;
6016
6017 for (seg = program_headers;
6018 seg < program_headers + elf_header.e_phnum;
6019 ++seg)
6020 {
6021 if (seg->p_type != PT_LOAD)
6022 continue;
6023
6024 if (sec->sh_addr >= seg->p_vaddr
6025 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6026 {
6027 aux->seg_base = seg->p_vaddr;
6028 break;
6029 }
6030 }
6031 }
6032
6033 /* Second, build the unwind table from the contents of the unwind
6034 section. */
6035 size = sec->sh_size;
6036 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6037 _("unwind table"));
6038 if (!table)
6039 return 0;
6040
6041 unw_ent_size = 16;
6042 nentries = size / unw_ent_size;
6043 size = unw_ent_size * nentries;
6044
6045 tep = aux->table = (struct hppa_unw_table_entry *)
6046 xcmalloc (nentries, sizeof (aux->table[0]));
6047
6048 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6049 {
6050 unsigned int tmp1, tmp2;
6051
6052 tep->start.section = SHN_UNDEF;
6053 tep->end.section = SHN_UNDEF;
6054
6055 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6056 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6057 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6058 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6059
6060 tep->start.offset += aux->seg_base;
6061 tep->end.offset += aux->seg_base;
6062
6063 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6064 tep->Millicode = (tmp1 >> 30) & 0x1;
6065 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6066 tep->Region_description = (tmp1 >> 27) & 0x3;
6067 tep->reserved1 = (tmp1 >> 26) & 0x1;
6068 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6069 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6070 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6071 tep->Args_stored = (tmp1 >> 15) & 0x1;
6072 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6073 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6074 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6075 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6076 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6077 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6078 tep->cxx_info = (tmp1 >> 8) & 0x1;
6079 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6080 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6081 tep->reserved2 = (tmp1 >> 5) & 0x1;
6082 tep->Save_SP = (tmp1 >> 4) & 0x1;
6083 tep->Save_RP = (tmp1 >> 3) & 0x1;
6084 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6085 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6086 tep->Cleanup_defined = tmp1 & 0x1;
6087
6088 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6089 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6090 tep->Large_frame = (tmp2 >> 29) & 0x1;
6091 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6092 tep->reserved4 = (tmp2 >> 27) & 0x1;
6093 tep->Total_frame_size = tmp2 & 0x7ffffff;
6094 }
6095 free (table);
6096
6097 /* Third, apply any relocations to the unwind table. */
6098 for (relsec = section_headers;
6099 relsec < section_headers + elf_header.e_shnum;
6100 ++relsec)
6101 {
6102 if (relsec->sh_type != SHT_RELA
6103 || relsec->sh_info >= elf_header.e_shnum
6104 || section_headers + relsec->sh_info != sec)
6105 continue;
6106
6107 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6108 & rela, & nrelas))
6109 return 0;
6110
6111 for (rp = rela; rp < rela + nrelas; ++rp)
6112 {
6113 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6114 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6115
6116 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6117 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6118 {
6119 warn (_("Skipping unexpected relocation type %s\n"), relname);
6120 continue;
6121 }
6122
6123 i = rp->r_offset / unw_ent_size;
6124
6125 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6126 {
6127 case 0:
6128 aux->table[i].start.section = sym->st_shndx;
6129 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6130 break;
6131 case 1:
6132 aux->table[i].end.section = sym->st_shndx;
6133 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6134 break;
6135 default:
6136 break;
6137 }
6138 }
6139
6140 free (rela);
6141 }
6142
6143 aux->table_len = nentries;
6144
6145 return 1;
6146 }
6147
6148 static int
6149 hppa_process_unwind (FILE * file)
6150 {
6151 struct hppa_unw_aux_info aux;
6152 Elf_Internal_Shdr * unwsec = NULL;
6153 Elf_Internal_Shdr * strsec;
6154 Elf_Internal_Shdr * sec;
6155 unsigned long i;
6156
6157 memset (& aux, 0, sizeof (aux));
6158
6159 if (string_table == NULL)
6160 return 1;
6161
6162 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6163 {
6164 if (sec->sh_type == SHT_SYMTAB
6165 && sec->sh_link < elf_header.e_shnum)
6166 {
6167 aux.nsyms = sec->sh_size / sec->sh_entsize;
6168 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6169
6170 strsec = section_headers + sec->sh_link;
6171 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6172 1, strsec->sh_size,
6173 _("string table"));
6174 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6175 }
6176 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6177 unwsec = sec;
6178 }
6179
6180 if (!unwsec)
6181 printf (_("\nThere are no unwind sections in this file.\n"));
6182
6183 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6184 {
6185 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6186 {
6187 printf (_("\nUnwind section "));
6188 printf (_("'%s'"), SECTION_NAME (sec));
6189
6190 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6191 (unsigned long) sec->sh_offset,
6192 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6193
6194 slurp_hppa_unwind_table (file, &aux, sec);
6195 if (aux.table_len > 0)
6196 dump_hppa_unwind (&aux);
6197
6198 if (aux.table)
6199 free ((char *) aux.table);
6200 aux.table = NULL;
6201 }
6202 }
6203
6204 if (aux.symtab)
6205 free (aux.symtab);
6206 if (aux.strtab)
6207 free ((char *) aux.strtab);
6208
6209 return 1;
6210 }
6211
6212 struct arm_section
6213 {
6214 unsigned char *data;
6215
6216 Elf_Internal_Shdr *sec;
6217 Elf_Internal_Rela *rela;
6218 unsigned long nrelas;
6219 unsigned int rel_type;
6220
6221 Elf_Internal_Rela *next_rela;
6222 };
6223
6224 struct arm_unw_aux_info
6225 {
6226 FILE *file;
6227
6228 Elf_Internal_Sym *symtab; /* The symbol table. */
6229 unsigned long nsyms; /* Number of symbols. */
6230 char *strtab; /* The string table. */
6231 unsigned long strtab_size; /* Size of string table. */
6232 };
6233
6234 static const char *
6235 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6236 bfd_vma fn, struct absaddr addr)
6237 {
6238 const char *procname;
6239 bfd_vma sym_offset;
6240
6241 if (addr.section == SHN_UNDEF)
6242 addr.offset = fn;
6243
6244 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6245 aux->strtab_size, addr, &procname,
6246 &sym_offset);
6247
6248 print_vma (fn, PREFIX_HEX);
6249
6250 if (procname)
6251 {
6252 fputs (" <", stdout);
6253 fputs (procname, stdout);
6254
6255 if (sym_offset)
6256 printf ("+0x%lx", (unsigned long) sym_offset);
6257 fputc ('>', stdout);
6258 }
6259
6260 return procname;
6261 }
6262
6263 static void
6264 arm_free_section (struct arm_section *arm_sec)
6265 {
6266 if (arm_sec->data != NULL)
6267 free (arm_sec->data);
6268
6269 if (arm_sec->rela != NULL)
6270 free (arm_sec->rela);
6271 }
6272
6273 static int
6274 arm_section_get_word (struct arm_unw_aux_info *aux,
6275 struct arm_section *arm_sec,
6276 Elf_Internal_Shdr *sec, bfd_vma word_offset,
6277 unsigned int *wordp, struct absaddr *addr)
6278 {
6279 Elf_Internal_Rela *rp;
6280 Elf_Internal_Sym *sym;
6281 const char * relname;
6282 unsigned int word;
6283 bfd_boolean wrapped;
6284
6285 addr->section = SHN_UNDEF;
6286 addr->offset = 0;
6287
6288 if (sec != arm_sec->sec)
6289 {
6290 Elf_Internal_Shdr *relsec;
6291
6292 arm_free_section (arm_sec);
6293
6294 arm_sec->sec = sec;
6295 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6296 sec->sh_size, _("unwind data"));
6297
6298 arm_sec->rela = NULL;
6299 arm_sec->nrelas = 0;
6300
6301 for (relsec = section_headers;
6302 relsec < section_headers + elf_header.e_shnum;
6303 ++relsec)
6304 {
6305 if (relsec->sh_info >= elf_header.e_shnum
6306 || section_headers + relsec->sh_info != sec)
6307 continue;
6308
6309 if (relsec->sh_type == SHT_REL)
6310 {
6311 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6312 relsec->sh_size,
6313 & arm_sec->rela, & arm_sec->nrelas))
6314 return 0;
6315 break;
6316 }
6317 else if (relsec->sh_type == SHT_RELA)
6318 {
6319 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6320 relsec->sh_size,
6321 & arm_sec->rela, & arm_sec->nrelas))
6322 return 0;
6323 break;
6324 }
6325 }
6326
6327 arm_sec->next_rela = arm_sec->rela;
6328 }
6329
6330 if (arm_sec->data == NULL)
6331 return 0;
6332
6333 word = byte_get (arm_sec->data + word_offset, 4);
6334
6335 wrapped = FALSE;
6336 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6337 {
6338 bfd_vma prelval, offset;
6339
6340 if (rp->r_offset > word_offset && !wrapped)
6341 {
6342 rp = arm_sec->rela;
6343 wrapped = TRUE;
6344 }
6345 if (rp->r_offset > word_offset)
6346 break;
6347
6348 if (rp->r_offset & 3)
6349 {
6350 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6351 (unsigned long) rp->r_offset);
6352 continue;
6353 }
6354
6355 if (rp->r_offset < word_offset)
6356 continue;
6357
6358 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6359
6360 if (streq (relname, "R_ARM_NONE"))
6361 continue;
6362
6363 if (! streq (relname, "R_ARM_PREL31"))
6364 {
6365 warn (_("Skipping unexpected relocation type %s\n"), relname);
6366 continue;
6367 }
6368
6369 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6370
6371 if (arm_sec->rel_type == SHT_REL)
6372 {
6373 offset = word & 0x7fffffff;
6374 if (offset & 0x40000000)
6375 offset |= ~ (bfd_vma) 0x7fffffff;
6376 }
6377 else
6378 offset = rp->r_addend;
6379
6380 offset += sym->st_value;
6381 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6382
6383 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6384 addr->section = sym->st_shndx;
6385 addr->offset = offset;
6386 break;
6387 }
6388
6389 *wordp = word;
6390 arm_sec->next_rela = rp;
6391
6392 return 1;
6393 }
6394
6395 static void
6396 decode_arm_unwind (struct arm_unw_aux_info *aux,
6397 unsigned int word, unsigned int remaining,
6398 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6399 struct arm_section *data_arm_sec)
6400 {
6401 int per_index;
6402 unsigned int more_words;
6403 struct absaddr addr;
6404
6405 #define ADVANCE \
6406 if (remaining == 0 && more_words) \
6407 { \
6408 data_offset += 4; \
6409 if (!arm_section_get_word (aux, data_arm_sec, data_sec, \
6410 data_offset, &word, &addr)) \
6411 return; \
6412 remaining = 4; \
6413 more_words--; \
6414 } \
6415
6416 #define GET_OP(OP) \
6417 ADVANCE; \
6418 if (remaining) \
6419 { \
6420 remaining--; \
6421 (OP) = word >> 24; \
6422 word <<= 8; \
6423 } \
6424 else \
6425 { \
6426 printf (_("[Truncated opcode]\n")); \
6427 return; \
6428 } \
6429 printf (_("0x%02x "), OP)
6430
6431 if (remaining == 0)
6432 {
6433 /* Fetch the first word. */
6434 if (!arm_section_get_word (aux, data_arm_sec, data_sec, data_offset,
6435 &word, &addr))
6436 return;
6437 remaining = 4;
6438 }
6439
6440 if ((word & 0x80000000) == 0)
6441 {
6442 /* Expand prel31 for personality routine. */
6443 bfd_vma fn;
6444 const char *procname;
6445
6446 fn = word;
6447 if (fn & 0x40000000)
6448 fn |= ~ (bfd_vma) 0x7fffffff;
6449 fn = fn + data_sec->sh_addr + data_offset;
6450
6451 printf (_(" Personality routine: "));
6452 procname = arm_print_vma_and_name (aux, fn, addr);
6453 fputc ('\n', stdout);
6454
6455 /* The GCC personality routines use the standard compact
6456 encoding, starting with one byte giving the number of
6457 words. */
6458 if (procname != NULL
6459 && (const_strneq (procname, "__gcc_personality_v0")
6460 || const_strneq (procname, "__gxx_personality_v0")
6461 || const_strneq (procname, "__gcj_personality_v0")
6462 || const_strneq (procname, "__gnu_objc_personality_v0")))
6463 {
6464 remaining = 0;
6465 more_words = 1;
6466 ADVANCE;
6467 if (!remaining)
6468 {
6469 printf (_(" [Truncated data]\n"));
6470 return;
6471 }
6472 more_words = word >> 24;
6473 word <<= 8;
6474 remaining--;
6475 }
6476 else
6477 return;
6478 }
6479 else
6480 {
6481 per_index = (word >> 24) & 0x7f;
6482 if (per_index != 0 && per_index != 1 && per_index != 2)
6483 {
6484 printf (_(" [reserved compact index %d]\n"), per_index);
6485 return;
6486 }
6487
6488 printf (_(" Compact model %d\n"), per_index);
6489 if (per_index == 0)
6490 {
6491 more_words = 0;
6492 word <<= 8;
6493 remaining--;
6494 }
6495 else
6496 {
6497 more_words = (word >> 16) & 0xff;
6498 word <<= 16;
6499 remaining -= 2;
6500 }
6501 }
6502
6503 /* Decode the unwinding instructions. */
6504 while (1)
6505 {
6506 unsigned int op, op2;
6507
6508 ADVANCE;
6509 if (remaining == 0)
6510 break;
6511 remaining--;
6512 op = word >> 24;
6513 word <<= 8;
6514
6515 printf (_(" 0x%02x "), op);
6516
6517 if ((op & 0xc0) == 0x00)
6518 {
6519 int offset = ((op & 0x3f) << 2) + 4;
6520 printf (_(" vsp = vsp + %d"), offset);
6521 }
6522 else if ((op & 0xc0) == 0x40)
6523 {
6524 int offset = ((op & 0x3f) << 2) + 4;
6525 printf (_(" vsp = vsp - %d"), offset);
6526 }
6527 else if ((op & 0xf0) == 0x80)
6528 {
6529 GET_OP (op2);
6530 if (op == 0x80 && op2 == 0)
6531 printf (_("Refuse to unwind"));
6532 else
6533 {
6534 unsigned int mask = ((op & 0x0f) << 8) | op2;
6535 int first = 1;
6536 int i;
6537
6538 printf ("pop {");
6539 for (i = 0; i < 12; i++)
6540 if (mask & (1 << i))
6541 {
6542 if (first)
6543 first = 0;
6544 else
6545 printf (", ");
6546 printf ("r%d", 4 + i);
6547 }
6548 printf ("}");
6549 }
6550 }
6551 else if ((op & 0xf0) == 0x90)
6552 {
6553 if (op == 0x9d || op == 0x9f)
6554 printf (_(" [Reserved]"));
6555 else
6556 printf (_(" vsp = r%d"), op & 0x0f);
6557 }
6558 else if ((op & 0xf0) == 0xa0)
6559 {
6560 int end = 4 + (op & 0x07);
6561 int first = 1;
6562 int i;
6563 printf (" pop {");
6564 for (i = 4; i <= end; i++)
6565 {
6566 if (first)
6567 first = 0;
6568 else
6569 printf (", ");
6570 printf ("r%d", i);
6571 }
6572 if (op & 0x08)
6573 {
6574 if (first)
6575 printf (", ");
6576 printf ("r14");
6577 }
6578 printf ("}");
6579 }
6580 else if (op == 0xb0)
6581 printf (_(" finish"));
6582 else if (op == 0xb1)
6583 {
6584 GET_OP (op2);
6585 if (op2 == 0 || (op2 & 0xf0) != 0)
6586 printf (_("[Spare]"));
6587 else
6588 {
6589 unsigned int mask = op2 & 0x0f;
6590 int first = 1;
6591 int i;
6592 printf ("pop {");
6593 for (i = 0; i < 12; i++)
6594 if (mask & (1 << i))
6595 {
6596 if (first)
6597 first = 0;
6598 else
6599 printf (", ");
6600 printf ("r%d", i);
6601 }
6602 printf ("}");
6603 }
6604 }
6605 else if (op == 0xb2)
6606 {
6607 unsigned char buf[9];
6608 unsigned int i, len;
6609 unsigned long offset;
6610 for (i = 0; i < sizeof (buf); i++)
6611 {
6612 GET_OP (buf[i]);
6613 if ((buf[i] & 0x80) == 0)
6614 break;
6615 }
6616 assert (i < sizeof (buf));
6617 offset = read_uleb128 (buf, &len);
6618 assert (len == i + 1);
6619 offset = offset * 4 + 0x204;
6620 printf (_("vsp = vsp + %ld"), offset);
6621 }
6622 else
6623 {
6624 if (op == 0xb3 || op == 0xc6 || op == 0xc7 || op == 0xc8 || op == 0xc9)
6625 {
6626 GET_OP (op2);
6627 printf (_("[unsupported two-byte opcode]"));
6628 }
6629 else
6630 {
6631 printf (_(" [unsupported opcode]"));
6632 }
6633 }
6634 printf ("\n");
6635 }
6636
6637 /* Decode the descriptors. Not implemented. */
6638 }
6639
6640 static void
6641 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
6642 {
6643 struct arm_section exidx_arm_sec, extab_arm_sec;
6644 unsigned int i, exidx_len;
6645
6646 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
6647 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
6648 exidx_len = exidx_sec->sh_size / 8;
6649
6650 for (i = 0; i < exidx_len; i++)
6651 {
6652 unsigned int exidx_fn, exidx_entry;
6653 struct absaddr fn_addr, entry_addr;
6654 bfd_vma fn;
6655
6656 fputc ('\n', stdout);
6657
6658 if (!arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6659 8 * i, &exidx_fn, &fn_addr)
6660 || !arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6661 8 * i + 4, &exidx_entry, &entry_addr))
6662 {
6663 arm_free_section (&exidx_arm_sec);
6664 arm_free_section (&extab_arm_sec);
6665 return;
6666 }
6667
6668 fn = exidx_fn & 0x7fffffff;
6669 if (fn & 0x40000000)
6670 fn |= ~ (bfd_vma) 0x7fffffff;
6671 fn = fn + exidx_sec->sh_addr + 8 * i;
6672
6673 arm_print_vma_and_name (aux, fn, entry_addr);
6674 fputs (": ", stdout);
6675
6676 if (exidx_entry == 1)
6677 {
6678 print_vma (exidx_entry, PREFIX_HEX);
6679 fputs (" [cantunwind]\n", stdout);
6680 }
6681 else if (exidx_entry & 0x80000000)
6682 {
6683 print_vma (exidx_entry, PREFIX_HEX);
6684 fputc ('\n', stdout);
6685 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
6686 }
6687 else
6688 {
6689 bfd_vma table, table_offset = 0;
6690 Elf_Internal_Shdr *table_sec;
6691
6692 fputs ("@", stdout);
6693 table = exidx_entry;
6694 if (table & 0x40000000)
6695 table |= ~ (bfd_vma) 0x7fffffff;
6696 table = table + exidx_sec->sh_addr + 8 * i + 4;
6697 print_vma (table, PREFIX_HEX);
6698 printf ("\n");
6699
6700 /* Locate the matching .ARM.extab. */
6701 if (entry_addr.section != SHN_UNDEF
6702 && entry_addr.section < elf_header.e_shnum)
6703 {
6704 table_sec = section_headers + entry_addr.section;
6705 table_offset = entry_addr.offset;
6706 }
6707 else
6708 {
6709 table_sec = find_section_by_address (table);
6710 if (table_sec != NULL)
6711 table_offset = table - table_sec->sh_addr;
6712 }
6713 if (table_sec == NULL)
6714 {
6715 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
6716 (unsigned long) table);
6717 continue;
6718 }
6719 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
6720 &extab_arm_sec);
6721 }
6722 }
6723
6724 printf ("\n");
6725
6726 arm_free_section (&exidx_arm_sec);
6727 arm_free_section (&extab_arm_sec);
6728 }
6729
6730 static int
6731 arm_process_unwind (FILE *file)
6732 {
6733 struct arm_unw_aux_info aux;
6734 Elf_Internal_Shdr *unwsec = NULL;
6735 Elf_Internal_Shdr *strsec;
6736 Elf_Internal_Shdr *sec;
6737 unsigned long i;
6738
6739 memset (& aux, 0, sizeof (aux));
6740 aux.file = file;
6741
6742 if (string_table == NULL)
6743 return 1;
6744
6745 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6746 {
6747 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
6748 {
6749 aux.nsyms = sec->sh_size / sec->sh_entsize;
6750 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6751
6752 strsec = section_headers + sec->sh_link;
6753 aux.strtab = get_data (NULL, file, strsec->sh_offset,
6754 1, strsec->sh_size, _("string table"));
6755 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6756 }
6757 else if (sec->sh_type == SHT_ARM_EXIDX)
6758 unwsec = sec;
6759 }
6760
6761 if (!unwsec)
6762 printf (_("\nThere are no unwind sections in this file.\n"));
6763
6764 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6765 {
6766 if (sec->sh_type == SHT_ARM_EXIDX)
6767 {
6768 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
6769 SECTION_NAME (sec),
6770 (unsigned long) sec->sh_offset,
6771 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
6772
6773 dump_arm_unwind (&aux, sec);
6774 }
6775 }
6776
6777 if (aux.symtab)
6778 free (aux.symtab);
6779 if (aux.strtab)
6780 free ((char *) aux.strtab);
6781
6782 return 1;
6783 }
6784
6785 static int
6786 process_unwind (FILE * file)
6787 {
6788 struct unwind_handler
6789 {
6790 int machtype;
6791 int (* handler)(FILE *);
6792 } handlers[] =
6793 {
6794 { EM_ARM, arm_process_unwind },
6795 { EM_IA_64, ia64_process_unwind },
6796 { EM_PARISC, hppa_process_unwind },
6797 { 0, 0 }
6798 };
6799 int i;
6800
6801 if (!do_unwind)
6802 return 1;
6803
6804 for (i = 0; handlers[i].handler != NULL; i++)
6805 if (elf_header.e_machine == handlers[i].machtype)
6806 return handlers[i].handler (file);
6807
6808 printf (_("\nThere are no unwind sections in this file.\n"));
6809 return 1;
6810 }
6811
6812 static void
6813 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
6814 {
6815 switch (entry->d_tag)
6816 {
6817 case DT_MIPS_FLAGS:
6818 if (entry->d_un.d_val == 0)
6819 printf (_("NONE\n"));
6820 else
6821 {
6822 static const char * opts[] =
6823 {
6824 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
6825 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
6826 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
6827 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
6828 "RLD_ORDER_SAFE"
6829 };
6830 unsigned int cnt;
6831 int first = 1;
6832
6833 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
6834 if (entry->d_un.d_val & (1 << cnt))
6835 {
6836 printf ("%s%s", first ? "" : " ", opts[cnt]);
6837 first = 0;
6838 }
6839 puts ("");
6840 }
6841 break;
6842
6843 case DT_MIPS_IVERSION:
6844 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6845 printf (_("Interface Version: %s\n"), GET_DYNAMIC_NAME (entry->d_un.d_val));
6846 else
6847 printf (_("<corrupt: %ld>\n"), (long) entry->d_un.d_ptr);
6848 break;
6849
6850 case DT_MIPS_TIME_STAMP:
6851 {
6852 char timebuf[20];
6853 struct tm * tmp;
6854
6855 time_t atime = entry->d_un.d_val;
6856 tmp = gmtime (&atime);
6857 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
6858 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6859 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6860 printf (_("Time Stamp: %s\n"), timebuf);
6861 }
6862 break;
6863
6864 case DT_MIPS_RLD_VERSION:
6865 case DT_MIPS_LOCAL_GOTNO:
6866 case DT_MIPS_CONFLICTNO:
6867 case DT_MIPS_LIBLISTNO:
6868 case DT_MIPS_SYMTABNO:
6869 case DT_MIPS_UNREFEXTNO:
6870 case DT_MIPS_HIPAGENO:
6871 case DT_MIPS_DELTA_CLASS_NO:
6872 case DT_MIPS_DELTA_INSTANCE_NO:
6873 case DT_MIPS_DELTA_RELOC_NO:
6874 case DT_MIPS_DELTA_SYM_NO:
6875 case DT_MIPS_DELTA_CLASSSYM_NO:
6876 case DT_MIPS_COMPACT_SIZE:
6877 printf ("%ld\n", (long) entry->d_un.d_ptr);
6878 break;
6879
6880 default:
6881 printf ("%#lx\n", (unsigned long) entry->d_un.d_ptr);
6882 }
6883 }
6884
6885 static void
6886 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
6887 {
6888 switch (entry->d_tag)
6889 {
6890 case DT_HP_DLD_FLAGS:
6891 {
6892 static struct
6893 {
6894 long int bit;
6895 const char * str;
6896 }
6897 flags[] =
6898 {
6899 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
6900 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
6901 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
6902 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
6903 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
6904 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
6905 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
6906 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
6907 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
6908 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
6909 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
6910 { DT_HP_GST, "HP_GST" },
6911 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
6912 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
6913 { DT_HP_NODELETE, "HP_NODELETE" },
6914 { DT_HP_GROUP, "HP_GROUP" },
6915 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
6916 };
6917 int first = 1;
6918 size_t cnt;
6919 bfd_vma val = entry->d_un.d_val;
6920
6921 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
6922 if (val & flags[cnt].bit)
6923 {
6924 if (! first)
6925 putchar (' ');
6926 fputs (flags[cnt].str, stdout);
6927 first = 0;
6928 val ^= flags[cnt].bit;
6929 }
6930
6931 if (val != 0 || first)
6932 {
6933 if (! first)
6934 putchar (' ');
6935 print_vma (val, HEX);
6936 }
6937 }
6938 break;
6939
6940 default:
6941 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6942 break;
6943 }
6944 putchar ('\n');
6945 }
6946
6947 #ifdef BFD64
6948
6949 /* VMS vs Unix time offset and factor. */
6950
6951 #define VMS_EPOCH_OFFSET 35067168000000000LL
6952 #define VMS_GRANULARITY_FACTOR 10000000
6953
6954 /* Display a VMS time in a human readable format. */
6955
6956 static void
6957 print_vms_time (bfd_int64_t vmstime)
6958 {
6959 struct tm *tm;
6960 time_t unxtime;
6961
6962 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
6963 tm = gmtime (&unxtime);
6964 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
6965 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
6966 tm->tm_hour, tm->tm_min, tm->tm_sec);
6967 }
6968 #endif /* BFD64 */
6969
6970 static void
6971 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
6972 {
6973 switch (entry->d_tag)
6974 {
6975 case DT_IA_64_PLT_RESERVE:
6976 /* First 3 slots reserved. */
6977 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6978 printf (" -- ");
6979 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
6980 break;
6981
6982 case DT_IA_64_VMS_LINKTIME:
6983 #ifdef BFD64
6984 print_vms_time (entry->d_un.d_val);
6985 #endif
6986 break;
6987
6988 case DT_IA_64_VMS_LNKFLAGS:
6989 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6990 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
6991 printf (" CALL_DEBUG");
6992 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
6993 printf (" NOP0BUFS");
6994 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
6995 printf (" P0IMAGE");
6996 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
6997 printf (" MKTHREADS");
6998 if (entry->d_un.d_val & VMS_LF_UPCALLS)
6999 printf (" UPCALLS");
7000 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7001 printf (" IMGSTA");
7002 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7003 printf (" INITIALIZE");
7004 if (entry->d_un.d_val & VMS_LF_MAIN)
7005 printf (" MAIN");
7006 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7007 printf (" EXE_INIT");
7008 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7009 printf (" TBK_IN_IMG");
7010 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7011 printf (" DBG_IN_IMG");
7012 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7013 printf (" TBK_IN_DSF");
7014 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7015 printf (" DBG_IN_DSF");
7016 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7017 printf (" SIGNATURES");
7018 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7019 printf (" REL_SEG_OFF");
7020 break;
7021
7022 default:
7023 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7024 break;
7025 }
7026 putchar ('\n');
7027 }
7028
7029 static int
7030 get_32bit_dynamic_section (FILE * file)
7031 {
7032 Elf32_External_Dyn * edyn;
7033 Elf32_External_Dyn * ext;
7034 Elf_Internal_Dyn * entry;
7035
7036 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7037 dynamic_size, _("dynamic section"));
7038 if (!edyn)
7039 return 0;
7040
7041 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7042 might not have the luxury of section headers. Look for the DT_NULL
7043 terminator to determine the number of entries. */
7044 for (ext = edyn, dynamic_nent = 0;
7045 (char *) ext < (char *) edyn + dynamic_size;
7046 ext++)
7047 {
7048 dynamic_nent++;
7049 if (BYTE_GET (ext->d_tag) == DT_NULL)
7050 break;
7051 }
7052
7053 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7054 sizeof (* entry));
7055 if (dynamic_section == NULL)
7056 {
7057 error (_("Out of memory\n"));
7058 free (edyn);
7059 return 0;
7060 }
7061
7062 for (ext = edyn, entry = dynamic_section;
7063 entry < dynamic_section + dynamic_nent;
7064 ext++, entry++)
7065 {
7066 entry->d_tag = BYTE_GET (ext->d_tag);
7067 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7068 }
7069
7070 free (edyn);
7071
7072 return 1;
7073 }
7074
7075 static int
7076 get_64bit_dynamic_section (FILE * file)
7077 {
7078 Elf64_External_Dyn * edyn;
7079 Elf64_External_Dyn * ext;
7080 Elf_Internal_Dyn * entry;
7081
7082 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7083 dynamic_size, _("dynamic section"));
7084 if (!edyn)
7085 return 0;
7086
7087 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7088 might not have the luxury of section headers. Look for the DT_NULL
7089 terminator to determine the number of entries. */
7090 for (ext = edyn, dynamic_nent = 0;
7091 (char *) ext < (char *) edyn + dynamic_size;
7092 ext++)
7093 {
7094 dynamic_nent++;
7095 if (BYTE_GET (ext->d_tag) == DT_NULL)
7096 break;
7097 }
7098
7099 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7100 sizeof (* entry));
7101 if (dynamic_section == NULL)
7102 {
7103 error (_("Out of memory\n"));
7104 free (edyn);
7105 return 0;
7106 }
7107
7108 for (ext = edyn, entry = dynamic_section;
7109 entry < dynamic_section + dynamic_nent;
7110 ext++, entry++)
7111 {
7112 entry->d_tag = BYTE_GET (ext->d_tag);
7113 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7114 }
7115
7116 free (edyn);
7117
7118 return 1;
7119 }
7120
7121 static void
7122 print_dynamic_flags (bfd_vma flags)
7123 {
7124 int first = 1;
7125
7126 while (flags)
7127 {
7128 bfd_vma flag;
7129
7130 flag = flags & - flags;
7131 flags &= ~ flag;
7132
7133 if (first)
7134 first = 0;
7135 else
7136 putc (' ', stdout);
7137
7138 switch (flag)
7139 {
7140 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7141 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7142 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7143 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7144 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7145 default: fputs (_("unknown"), stdout); break;
7146 }
7147 }
7148 puts ("");
7149 }
7150
7151 /* Parse and display the contents of the dynamic section. */
7152
7153 static int
7154 process_dynamic_section (FILE * file)
7155 {
7156 Elf_Internal_Dyn * entry;
7157
7158 if (dynamic_size == 0)
7159 {
7160 if (do_dynamic)
7161 printf (_("\nThere is no dynamic section in this file.\n"));
7162
7163 return 1;
7164 }
7165
7166 if (is_32bit_elf)
7167 {
7168 if (! get_32bit_dynamic_section (file))
7169 return 0;
7170 }
7171 else if (! get_64bit_dynamic_section (file))
7172 return 0;
7173
7174 /* Find the appropriate symbol table. */
7175 if (dynamic_symbols == NULL)
7176 {
7177 for (entry = dynamic_section;
7178 entry < dynamic_section + dynamic_nent;
7179 ++entry)
7180 {
7181 Elf_Internal_Shdr section;
7182
7183 if (entry->d_tag != DT_SYMTAB)
7184 continue;
7185
7186 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7187
7188 /* Since we do not know how big the symbol table is,
7189 we default to reading in the entire file (!) and
7190 processing that. This is overkill, I know, but it
7191 should work. */
7192 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7193
7194 if (archive_file_offset != 0)
7195 section.sh_size = archive_file_size - section.sh_offset;
7196 else
7197 {
7198 if (fseek (file, 0, SEEK_END))
7199 error (_("Unable to seek to end of file!\n"));
7200
7201 section.sh_size = ftell (file) - section.sh_offset;
7202 }
7203
7204 if (is_32bit_elf)
7205 section.sh_entsize = sizeof (Elf32_External_Sym);
7206 else
7207 section.sh_entsize = sizeof (Elf64_External_Sym);
7208
7209 num_dynamic_syms = section.sh_size / section.sh_entsize;
7210 if (num_dynamic_syms < 1)
7211 {
7212 error (_("Unable to determine the number of symbols to load\n"));
7213 continue;
7214 }
7215
7216 dynamic_symbols = GET_ELF_SYMBOLS (file, &section);
7217 }
7218 }
7219
7220 /* Similarly find a string table. */
7221 if (dynamic_strings == NULL)
7222 {
7223 for (entry = dynamic_section;
7224 entry < dynamic_section + dynamic_nent;
7225 ++entry)
7226 {
7227 unsigned long offset;
7228 long str_tab_len;
7229
7230 if (entry->d_tag != DT_STRTAB)
7231 continue;
7232
7233 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7234
7235 /* Since we do not know how big the string table is,
7236 we default to reading in the entire file (!) and
7237 processing that. This is overkill, I know, but it
7238 should work. */
7239
7240 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7241
7242 if (archive_file_offset != 0)
7243 str_tab_len = archive_file_size - offset;
7244 else
7245 {
7246 if (fseek (file, 0, SEEK_END))
7247 error (_("Unable to seek to end of file\n"));
7248 str_tab_len = ftell (file) - offset;
7249 }
7250
7251 if (str_tab_len < 1)
7252 {
7253 error
7254 (_("Unable to determine the length of the dynamic string table\n"));
7255 continue;
7256 }
7257
7258 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7259 str_tab_len,
7260 _("dynamic string table"));
7261 dynamic_strings_length = str_tab_len;
7262 break;
7263 }
7264 }
7265
7266 /* And find the syminfo section if available. */
7267 if (dynamic_syminfo == NULL)
7268 {
7269 unsigned long syminsz = 0;
7270
7271 for (entry = dynamic_section;
7272 entry < dynamic_section + dynamic_nent;
7273 ++entry)
7274 {
7275 if (entry->d_tag == DT_SYMINENT)
7276 {
7277 /* Note: these braces are necessary to avoid a syntax
7278 error from the SunOS4 C compiler. */
7279 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7280 }
7281 else if (entry->d_tag == DT_SYMINSZ)
7282 syminsz = entry->d_un.d_val;
7283 else if (entry->d_tag == DT_SYMINFO)
7284 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7285 syminsz);
7286 }
7287
7288 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7289 {
7290 Elf_External_Syminfo * extsyminfo;
7291 Elf_External_Syminfo * extsym;
7292 Elf_Internal_Syminfo * syminfo;
7293
7294 /* There is a syminfo section. Read the data. */
7295 extsyminfo = (Elf_External_Syminfo *)
7296 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7297 _("symbol information"));
7298 if (!extsyminfo)
7299 return 0;
7300
7301 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7302 if (dynamic_syminfo == NULL)
7303 {
7304 error (_("Out of memory\n"));
7305 return 0;
7306 }
7307
7308 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7309 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7310 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7311 ++syminfo, ++extsym)
7312 {
7313 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7314 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7315 }
7316
7317 free (extsyminfo);
7318 }
7319 }
7320
7321 if (do_dynamic && dynamic_addr)
7322 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7323 dynamic_addr, dynamic_nent);
7324 if (do_dynamic)
7325 printf (_(" Tag Type Name/Value\n"));
7326
7327 for (entry = dynamic_section;
7328 entry < dynamic_section + dynamic_nent;
7329 entry++)
7330 {
7331 if (do_dynamic)
7332 {
7333 const char * dtype;
7334
7335 putchar (' ');
7336 print_vma (entry->d_tag, FULL_HEX);
7337 dtype = get_dynamic_type (entry->d_tag);
7338 printf (" (%s)%*s", dtype,
7339 ((is_32bit_elf ? 27 : 19)
7340 - (int) strlen (dtype)),
7341 " ");
7342 }
7343
7344 switch (entry->d_tag)
7345 {
7346 case DT_FLAGS:
7347 if (do_dynamic)
7348 print_dynamic_flags (entry->d_un.d_val);
7349 break;
7350
7351 case DT_AUXILIARY:
7352 case DT_FILTER:
7353 case DT_CONFIG:
7354 case DT_DEPAUDIT:
7355 case DT_AUDIT:
7356 if (do_dynamic)
7357 {
7358 switch (entry->d_tag)
7359 {
7360 case DT_AUXILIARY:
7361 printf (_("Auxiliary library"));
7362 break;
7363
7364 case DT_FILTER:
7365 printf (_("Filter library"));
7366 break;
7367
7368 case DT_CONFIG:
7369 printf (_("Configuration file"));
7370 break;
7371
7372 case DT_DEPAUDIT:
7373 printf (_("Dependency audit library"));
7374 break;
7375
7376 case DT_AUDIT:
7377 printf (_("Audit library"));
7378 break;
7379 }
7380
7381 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7382 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7383 else
7384 {
7385 printf (": ");
7386 print_vma (entry->d_un.d_val, PREFIX_HEX);
7387 putchar ('\n');
7388 }
7389 }
7390 break;
7391
7392 case DT_FEATURE:
7393 if (do_dynamic)
7394 {
7395 printf (_("Flags:"));
7396
7397 if (entry->d_un.d_val == 0)
7398 printf (_(" None\n"));
7399 else
7400 {
7401 unsigned long int val = entry->d_un.d_val;
7402
7403 if (val & DTF_1_PARINIT)
7404 {
7405 printf (" PARINIT");
7406 val ^= DTF_1_PARINIT;
7407 }
7408 if (val & DTF_1_CONFEXP)
7409 {
7410 printf (" CONFEXP");
7411 val ^= DTF_1_CONFEXP;
7412 }
7413 if (val != 0)
7414 printf (" %lx", val);
7415 puts ("");
7416 }
7417 }
7418 break;
7419
7420 case DT_POSFLAG_1:
7421 if (do_dynamic)
7422 {
7423 printf (_("Flags:"));
7424
7425 if (entry->d_un.d_val == 0)
7426 printf (_(" None\n"));
7427 else
7428 {
7429 unsigned long int val = entry->d_un.d_val;
7430
7431 if (val & DF_P1_LAZYLOAD)
7432 {
7433 printf (" LAZYLOAD");
7434 val ^= DF_P1_LAZYLOAD;
7435 }
7436 if (val & DF_P1_GROUPPERM)
7437 {
7438 printf (" GROUPPERM");
7439 val ^= DF_P1_GROUPPERM;
7440 }
7441 if (val != 0)
7442 printf (" %lx", val);
7443 puts ("");
7444 }
7445 }
7446 break;
7447
7448 case DT_FLAGS_1:
7449 if (do_dynamic)
7450 {
7451 printf (_("Flags:"));
7452 if (entry->d_un.d_val == 0)
7453 printf (_(" None\n"));
7454 else
7455 {
7456 unsigned long int val = entry->d_un.d_val;
7457
7458 if (val & DF_1_NOW)
7459 {
7460 printf (" NOW");
7461 val ^= DF_1_NOW;
7462 }
7463 if (val & DF_1_GLOBAL)
7464 {
7465 printf (" GLOBAL");
7466 val ^= DF_1_GLOBAL;
7467 }
7468 if (val & DF_1_GROUP)
7469 {
7470 printf (" GROUP");
7471 val ^= DF_1_GROUP;
7472 }
7473 if (val & DF_1_NODELETE)
7474 {
7475 printf (" NODELETE");
7476 val ^= DF_1_NODELETE;
7477 }
7478 if (val & DF_1_LOADFLTR)
7479 {
7480 printf (" LOADFLTR");
7481 val ^= DF_1_LOADFLTR;
7482 }
7483 if (val & DF_1_INITFIRST)
7484 {
7485 printf (" INITFIRST");
7486 val ^= DF_1_INITFIRST;
7487 }
7488 if (val & DF_1_NOOPEN)
7489 {
7490 printf (" NOOPEN");
7491 val ^= DF_1_NOOPEN;
7492 }
7493 if (val & DF_1_ORIGIN)
7494 {
7495 printf (" ORIGIN");
7496 val ^= DF_1_ORIGIN;
7497 }
7498 if (val & DF_1_DIRECT)
7499 {
7500 printf (" DIRECT");
7501 val ^= DF_1_DIRECT;
7502 }
7503 if (val & DF_1_TRANS)
7504 {
7505 printf (" TRANS");
7506 val ^= DF_1_TRANS;
7507 }
7508 if (val & DF_1_INTERPOSE)
7509 {
7510 printf (" INTERPOSE");
7511 val ^= DF_1_INTERPOSE;
7512 }
7513 if (val & DF_1_NODEFLIB)
7514 {
7515 printf (" NODEFLIB");
7516 val ^= DF_1_NODEFLIB;
7517 }
7518 if (val & DF_1_NODUMP)
7519 {
7520 printf (" NODUMP");
7521 val ^= DF_1_NODUMP;
7522 }
7523 if (val & DF_1_CONLFAT)
7524 {
7525 printf (" CONLFAT");
7526 val ^= DF_1_CONLFAT;
7527 }
7528 if (val != 0)
7529 printf (" %lx", val);
7530 puts ("");
7531 }
7532 }
7533 break;
7534
7535 case DT_PLTREL:
7536 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7537 if (do_dynamic)
7538 puts (get_dynamic_type (entry->d_un.d_val));
7539 break;
7540
7541 case DT_NULL :
7542 case DT_NEEDED :
7543 case DT_PLTGOT :
7544 case DT_HASH :
7545 case DT_STRTAB :
7546 case DT_SYMTAB :
7547 case DT_RELA :
7548 case DT_INIT :
7549 case DT_FINI :
7550 case DT_SONAME :
7551 case DT_RPATH :
7552 case DT_SYMBOLIC:
7553 case DT_REL :
7554 case DT_DEBUG :
7555 case DT_TEXTREL :
7556 case DT_JMPREL :
7557 case DT_RUNPATH :
7558 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7559
7560 if (do_dynamic)
7561 {
7562 char * name;
7563
7564 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7565 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7566 else
7567 name = NULL;
7568
7569 if (name)
7570 {
7571 switch (entry->d_tag)
7572 {
7573 case DT_NEEDED:
7574 printf (_("Shared library: [%s]"), name);
7575
7576 if (streq (name, program_interpreter))
7577 printf (_(" program interpreter"));
7578 break;
7579
7580 case DT_SONAME:
7581 printf (_("Library soname: [%s]"), name);
7582 break;
7583
7584 case DT_RPATH:
7585 printf (_("Library rpath: [%s]"), name);
7586 break;
7587
7588 case DT_RUNPATH:
7589 printf (_("Library runpath: [%s]"), name);
7590 break;
7591
7592 default:
7593 print_vma (entry->d_un.d_val, PREFIX_HEX);
7594 break;
7595 }
7596 }
7597 else
7598 print_vma (entry->d_un.d_val, PREFIX_HEX);
7599
7600 putchar ('\n');
7601 }
7602 break;
7603
7604 case DT_PLTRELSZ:
7605 case DT_RELASZ :
7606 case DT_STRSZ :
7607 case DT_RELSZ :
7608 case DT_RELAENT :
7609 case DT_SYMENT :
7610 case DT_RELENT :
7611 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7612 case DT_PLTPADSZ:
7613 case DT_MOVEENT :
7614 case DT_MOVESZ :
7615 case DT_INIT_ARRAYSZ:
7616 case DT_FINI_ARRAYSZ:
7617 case DT_GNU_CONFLICTSZ:
7618 case DT_GNU_LIBLISTSZ:
7619 if (do_dynamic)
7620 {
7621 print_vma (entry->d_un.d_val, UNSIGNED);
7622 printf (_(" (bytes)\n"));
7623 }
7624 break;
7625
7626 case DT_VERDEFNUM:
7627 case DT_VERNEEDNUM:
7628 case DT_RELACOUNT:
7629 case DT_RELCOUNT:
7630 if (do_dynamic)
7631 {
7632 print_vma (entry->d_un.d_val, UNSIGNED);
7633 putchar ('\n');
7634 }
7635 break;
7636
7637 case DT_SYMINSZ:
7638 case DT_SYMINENT:
7639 case DT_SYMINFO:
7640 case DT_USED:
7641 case DT_INIT_ARRAY:
7642 case DT_FINI_ARRAY:
7643 if (do_dynamic)
7644 {
7645 if (entry->d_tag == DT_USED
7646 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
7647 {
7648 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7649
7650 if (*name)
7651 {
7652 printf (_("Not needed object: [%s]\n"), name);
7653 break;
7654 }
7655 }
7656
7657 print_vma (entry->d_un.d_val, PREFIX_HEX);
7658 putchar ('\n');
7659 }
7660 break;
7661
7662 case DT_BIND_NOW:
7663 /* The value of this entry is ignored. */
7664 if (do_dynamic)
7665 putchar ('\n');
7666 break;
7667
7668 case DT_GNU_PRELINKED:
7669 if (do_dynamic)
7670 {
7671 struct tm * tmp;
7672 time_t atime = entry->d_un.d_val;
7673
7674 tmp = gmtime (&atime);
7675 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
7676 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7677 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7678
7679 }
7680 break;
7681
7682 case DT_GNU_HASH:
7683 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
7684 if (do_dynamic)
7685 {
7686 print_vma (entry->d_un.d_val, PREFIX_HEX);
7687 putchar ('\n');
7688 }
7689 break;
7690
7691 default:
7692 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
7693 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
7694 entry->d_un.d_val;
7695
7696 if (do_dynamic)
7697 {
7698 switch (elf_header.e_machine)
7699 {
7700 case EM_MIPS:
7701 case EM_MIPS_RS3_LE:
7702 dynamic_section_mips_val (entry);
7703 break;
7704 case EM_PARISC:
7705 dynamic_section_parisc_val (entry);
7706 break;
7707 case EM_IA_64:
7708 dynamic_section_ia64_val (entry);
7709 break;
7710 default:
7711 print_vma (entry->d_un.d_val, PREFIX_HEX);
7712 putchar ('\n');
7713 }
7714 }
7715 break;
7716 }
7717 }
7718
7719 return 1;
7720 }
7721
7722 static char *
7723 get_ver_flags (unsigned int flags)
7724 {
7725 static char buff[32];
7726
7727 buff[0] = 0;
7728
7729 if (flags == 0)
7730 return _("none");
7731
7732 if (flags & VER_FLG_BASE)
7733 strcat (buff, "BASE ");
7734
7735 if (flags & VER_FLG_WEAK)
7736 {
7737 if (flags & VER_FLG_BASE)
7738 strcat (buff, "| ");
7739
7740 strcat (buff, "WEAK ");
7741 }
7742
7743 if (flags & VER_FLG_INFO)
7744 {
7745 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7746 strcat (buff, "| ");
7747
7748 strcat (buff, "INFO ");
7749 }
7750
7751 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7752 strcat (buff, _("| <unknown>"));
7753
7754 return buff;
7755 }
7756
7757 /* Display the contents of the version sections. */
7758
7759 static int
7760 process_version_sections (FILE * file)
7761 {
7762 Elf_Internal_Shdr * section;
7763 unsigned i;
7764 int found = 0;
7765
7766 if (! do_version)
7767 return 1;
7768
7769 for (i = 0, section = section_headers;
7770 i < elf_header.e_shnum;
7771 i++, section++)
7772 {
7773 switch (section->sh_type)
7774 {
7775 case SHT_GNU_verdef:
7776 {
7777 Elf_External_Verdef * edefs;
7778 unsigned int idx;
7779 unsigned int cnt;
7780 char * endbuf;
7781
7782 found = 1;
7783
7784 printf
7785 (_("\nVersion definition section '%s' contains %u entries:\n"),
7786 SECTION_NAME (section), section->sh_info);
7787
7788 printf (_(" Addr: 0x"));
7789 printf_vma (section->sh_addr);
7790 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
7791 (unsigned long) section->sh_offset, section->sh_link,
7792 section->sh_link < elf_header.e_shnum
7793 ? SECTION_NAME (section_headers + section->sh_link)
7794 : _("<corrupt>"));
7795
7796 edefs = (Elf_External_Verdef *)
7797 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
7798 _("version definition section"));
7799 endbuf = (char *) edefs + section->sh_size;
7800 if (!edefs)
7801 break;
7802
7803 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
7804 {
7805 char * vstart;
7806 Elf_External_Verdef * edef;
7807 Elf_Internal_Verdef ent;
7808 Elf_External_Verdaux * eaux;
7809 Elf_Internal_Verdaux aux;
7810 int j;
7811 int isum;
7812
7813 /* Check for negative or very large indicies. */
7814 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
7815 break;
7816
7817 vstart = ((char *) edefs) + idx;
7818 if (vstart + sizeof (*edef) > endbuf)
7819 break;
7820
7821 edef = (Elf_External_Verdef *) vstart;
7822
7823 ent.vd_version = BYTE_GET (edef->vd_version);
7824 ent.vd_flags = BYTE_GET (edef->vd_flags);
7825 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
7826 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
7827 ent.vd_hash = BYTE_GET (edef->vd_hash);
7828 ent.vd_aux = BYTE_GET (edef->vd_aux);
7829 ent.vd_next = BYTE_GET (edef->vd_next);
7830
7831 printf (_(" %#06x: Rev: %d Flags: %s"),
7832 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
7833
7834 printf (_(" Index: %d Cnt: %d "),
7835 ent.vd_ndx, ent.vd_cnt);
7836
7837 /* Check for overflow. */
7838 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
7839 || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
7840 break;
7841
7842 vstart += ent.vd_aux;
7843
7844 eaux = (Elf_External_Verdaux *) vstart;
7845
7846 aux.vda_name = BYTE_GET (eaux->vda_name);
7847 aux.vda_next = BYTE_GET (eaux->vda_next);
7848
7849 if (VALID_DYNAMIC_NAME (aux.vda_name))
7850 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
7851 else
7852 printf (_("Name index: %ld\n"), aux.vda_name);
7853
7854 isum = idx + ent.vd_aux;
7855
7856 for (j = 1; j < ent.vd_cnt; j++)
7857 {
7858 /* Check for overflow. */
7859 if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
7860 || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
7861 break;
7862
7863 isum += aux.vda_next;
7864 vstart += aux.vda_next;
7865
7866 eaux = (Elf_External_Verdaux *) vstart;
7867 if (vstart + sizeof (*eaux) > endbuf)
7868 break;
7869
7870 aux.vda_name = BYTE_GET (eaux->vda_name);
7871 aux.vda_next = BYTE_GET (eaux->vda_next);
7872
7873 if (VALID_DYNAMIC_NAME (aux.vda_name))
7874 printf (_(" %#06x: Parent %d: %s\n"),
7875 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
7876 else
7877 printf (_(" %#06x: Parent %d, name index: %ld\n"),
7878 isum, j, aux.vda_name);
7879 }
7880
7881 if (j < ent.vd_cnt)
7882 printf (_(" Version def aux past end of section\n"));
7883
7884 idx += ent.vd_next;
7885 }
7886
7887 if (cnt < section->sh_info)
7888 printf (_(" Version definition past end of section\n"));
7889
7890 free (edefs);
7891 }
7892 break;
7893
7894 case SHT_GNU_verneed:
7895 {
7896 Elf_External_Verneed * eneed;
7897 unsigned int idx;
7898 unsigned int cnt;
7899 char * endbuf;
7900
7901 found = 1;
7902
7903 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
7904 SECTION_NAME (section), section->sh_info);
7905
7906 printf (_(" Addr: 0x"));
7907 printf_vma (section->sh_addr);
7908 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
7909 (unsigned long) section->sh_offset, section->sh_link,
7910 section->sh_link < elf_header.e_shnum
7911 ? SECTION_NAME (section_headers + section->sh_link)
7912 : _("<corrupt>"));
7913
7914 eneed = (Elf_External_Verneed *) get_data (NULL, file,
7915 section->sh_offset, 1,
7916 section->sh_size,
7917 _("version need section"));
7918 endbuf = (char *) eneed + section->sh_size;
7919 if (!eneed)
7920 break;
7921
7922 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
7923 {
7924 Elf_External_Verneed * entry;
7925 Elf_Internal_Verneed ent;
7926 int j;
7927 int isum;
7928 char * vstart;
7929
7930 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
7931 break;
7932
7933 vstart = ((char *) eneed) + idx;
7934 if (vstart + sizeof (*entry) > endbuf)
7935 break;
7936
7937 entry = (Elf_External_Verneed *) vstart;
7938
7939 ent.vn_version = BYTE_GET (entry->vn_version);
7940 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
7941 ent.vn_file = BYTE_GET (entry->vn_file);
7942 ent.vn_aux = BYTE_GET (entry->vn_aux);
7943 ent.vn_next = BYTE_GET (entry->vn_next);
7944
7945 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
7946
7947 if (VALID_DYNAMIC_NAME (ent.vn_file))
7948 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
7949 else
7950 printf (_(" File: %lx"), ent.vn_file);
7951
7952 printf (_(" Cnt: %d\n"), ent.vn_cnt);
7953
7954 /* Check for overflow. */
7955 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
7956 || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
7957 break;
7958
7959 vstart += ent.vn_aux;
7960
7961 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
7962 {
7963 Elf_External_Vernaux * eaux;
7964 Elf_Internal_Vernaux aux;
7965
7966 if (vstart + sizeof (*eaux) > endbuf)
7967 break;
7968 eaux = (Elf_External_Vernaux *) vstart;
7969
7970 aux.vna_hash = BYTE_GET (eaux->vna_hash);
7971 aux.vna_flags = BYTE_GET (eaux->vna_flags);
7972 aux.vna_other = BYTE_GET (eaux->vna_other);
7973 aux.vna_name = BYTE_GET (eaux->vna_name);
7974 aux.vna_next = BYTE_GET (eaux->vna_next);
7975
7976 if (VALID_DYNAMIC_NAME (aux.vna_name))
7977 printf (_(" %#06x: Name: %s"),
7978 isum, GET_DYNAMIC_NAME (aux.vna_name));
7979 else
7980 printf (_(" %#06x: Name index: %lx"),
7981 isum, aux.vna_name);
7982
7983 printf (_(" Flags: %s Version: %d\n"),
7984 get_ver_flags (aux.vna_flags), aux.vna_other);
7985
7986 /* Check for overflow. */
7987 if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
7988 || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
7989 break;
7990
7991 isum += aux.vna_next;
7992 vstart += aux.vna_next;
7993 }
7994 if (j < ent.vn_cnt)
7995 printf (_(" Version need aux past end of section\n"));
7996
7997 idx += ent.vn_next;
7998 }
7999 if (cnt < section->sh_info)
8000 printf (_(" Version need past end of section\n"));
8001
8002 free (eneed);
8003 }
8004 break;
8005
8006 case SHT_GNU_versym:
8007 {
8008 Elf_Internal_Shdr * link_section;
8009 int total;
8010 int cnt;
8011 unsigned char * edata;
8012 unsigned short * data;
8013 char * strtab;
8014 Elf_Internal_Sym * symbols;
8015 Elf_Internal_Shdr * string_sec;
8016 long off;
8017
8018 if (section->sh_link >= elf_header.e_shnum)
8019 break;
8020
8021 link_section = section_headers + section->sh_link;
8022 total = section->sh_size / sizeof (Elf_External_Versym);
8023
8024 if (link_section->sh_link >= elf_header.e_shnum)
8025 break;
8026
8027 found = 1;
8028
8029 symbols = GET_ELF_SYMBOLS (file, link_section);
8030 if (symbols == NULL)
8031 break;
8032
8033 string_sec = section_headers + link_section->sh_link;
8034
8035 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8036 string_sec->sh_size,
8037 _("version string table"));
8038 if (!strtab)
8039 break;
8040
8041 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8042 SECTION_NAME (section), total);
8043
8044 printf (_(" Addr: "));
8045 printf_vma (section->sh_addr);
8046 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8047 (unsigned long) section->sh_offset, section->sh_link,
8048 SECTION_NAME (link_section));
8049
8050 off = offset_from_vma (file,
8051 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8052 total * sizeof (short));
8053 edata = (unsigned char *) get_data (NULL, file, off, total,
8054 sizeof (short),
8055 _("version symbol data"));
8056 if (!edata)
8057 {
8058 free (strtab);
8059 break;
8060 }
8061
8062 data = (short unsigned int *) cmalloc (total, sizeof (short));
8063
8064 for (cnt = total; cnt --;)
8065 data[cnt] = byte_get (edata + cnt * sizeof (short),
8066 sizeof (short));
8067
8068 free (edata);
8069
8070 for (cnt = 0; cnt < total; cnt += 4)
8071 {
8072 int j, nn;
8073 int check_def, check_need;
8074 char * name;
8075
8076 printf (" %03x:", cnt);
8077
8078 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8079 switch (data[cnt + j])
8080 {
8081 case 0:
8082 fputs (_(" 0 (*local*) "), stdout);
8083 break;
8084
8085 case 1:
8086 fputs (_(" 1 (*global*) "), stdout);
8087 break;
8088
8089 default:
8090 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8091 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8092
8093 /* If this index value is greater than the size of the symbols
8094 array, break to avoid an out-of-bounds read, */
8095 if ((unsigned long)(cnt + j) >=
8096 ((unsigned long)link_section->sh_size /
8097 (unsigned long)link_section->sh_entsize))
8098 {
8099 warn (_("invalid index into symbol array\n"));
8100 break;
8101 }
8102
8103 check_def = 1;
8104 check_need = 1;
8105 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8106 || section_headers[symbols[cnt + j].st_shndx].sh_type
8107 != SHT_NOBITS)
8108 {
8109 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8110 check_def = 0;
8111 else
8112 check_need = 0;
8113 }
8114
8115 if (check_need
8116 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8117 {
8118 Elf_Internal_Verneed ivn;
8119 unsigned long offset;
8120
8121 offset = offset_from_vma
8122 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8123 sizeof (Elf_External_Verneed));
8124
8125 do
8126 {
8127 Elf_Internal_Vernaux ivna;
8128 Elf_External_Verneed evn;
8129 Elf_External_Vernaux evna;
8130 unsigned long a_off;
8131
8132 get_data (&evn, file, offset, sizeof (evn), 1,
8133 _("version need"));
8134
8135 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8136 ivn.vn_next = BYTE_GET (evn.vn_next);
8137
8138 a_off = offset + ivn.vn_aux;
8139
8140 do
8141 {
8142 get_data (&evna, file, a_off, sizeof (evna),
8143 1, _("version need aux (2)"));
8144
8145 ivna.vna_next = BYTE_GET (evna.vna_next);
8146 ivna.vna_other = BYTE_GET (evna.vna_other);
8147
8148 a_off += ivna.vna_next;
8149 }
8150 while (ivna.vna_other != data[cnt + j]
8151 && ivna.vna_next != 0);
8152
8153 if (ivna.vna_other == data[cnt + j])
8154 {
8155 ivna.vna_name = BYTE_GET (evna.vna_name);
8156
8157 if (ivna.vna_name >= string_sec->sh_size)
8158 name = _("*invalid*");
8159 else
8160 name = strtab + ivna.vna_name;
8161 nn += printf ("(%s%-*s",
8162 name,
8163 12 - (int) strlen (name),
8164 ")");
8165 check_def = 0;
8166 break;
8167 }
8168
8169 offset += ivn.vn_next;
8170 }
8171 while (ivn.vn_next);
8172 }
8173
8174 if (check_def && data[cnt + j] != 0x8001
8175 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8176 {
8177 Elf_Internal_Verdef ivd;
8178 Elf_External_Verdef evd;
8179 unsigned long offset;
8180
8181 offset = offset_from_vma
8182 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8183 sizeof evd);
8184
8185 do
8186 {
8187 get_data (&evd, file, offset, sizeof (evd), 1,
8188 _("version def"));
8189
8190 ivd.vd_next = BYTE_GET (evd.vd_next);
8191 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8192
8193 offset += ivd.vd_next;
8194 }
8195 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8196 && ivd.vd_next != 0);
8197
8198 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8199 {
8200 Elf_External_Verdaux evda;
8201 Elf_Internal_Verdaux ivda;
8202
8203 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8204
8205 get_data (&evda, file,
8206 offset - ivd.vd_next + ivd.vd_aux,
8207 sizeof (evda), 1,
8208 _("version def aux"));
8209
8210 ivda.vda_name = BYTE_GET (evda.vda_name);
8211
8212 if (ivda.vda_name >= string_sec->sh_size)
8213 name = _("*invalid*");
8214 else
8215 name = strtab + ivda.vda_name;
8216 nn += printf ("(%s%-*s",
8217 name,
8218 12 - (int) strlen (name),
8219 ")");
8220 }
8221 }
8222
8223 if (nn < 18)
8224 printf ("%*c", 18 - nn, ' ');
8225 }
8226
8227 putchar ('\n');
8228 }
8229
8230 free (data);
8231 free (strtab);
8232 free (symbols);
8233 }
8234 break;
8235
8236 default:
8237 break;
8238 }
8239 }
8240
8241 if (! found)
8242 printf (_("\nNo version information found in this file.\n"));
8243
8244 return 1;
8245 }
8246
8247 static const char *
8248 get_symbol_binding (unsigned int binding)
8249 {
8250 static char buff[32];
8251
8252 switch (binding)
8253 {
8254 case STB_LOCAL: return "LOCAL";
8255 case STB_GLOBAL: return "GLOBAL";
8256 case STB_WEAK: return "WEAK";
8257 default:
8258 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8259 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8260 binding);
8261 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8262 {
8263 if (binding == STB_GNU_UNIQUE
8264 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8265 /* GNU/Linux is still using the default value 0. */
8266 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8267 return "UNIQUE";
8268 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8269 }
8270 else
8271 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8272 return buff;
8273 }
8274 }
8275
8276 static const char *
8277 get_symbol_type (unsigned int type)
8278 {
8279 static char buff[32];
8280
8281 switch (type)
8282 {
8283 case STT_NOTYPE: return "NOTYPE";
8284 case STT_OBJECT: return "OBJECT";
8285 case STT_FUNC: return "FUNC";
8286 case STT_SECTION: return "SECTION";
8287 case STT_FILE: return "FILE";
8288 case STT_COMMON: return "COMMON";
8289 case STT_TLS: return "TLS";
8290 case STT_RELC: return "RELC";
8291 case STT_SRELC: return "SRELC";
8292 default:
8293 if (type >= STT_LOPROC && type <= STT_HIPROC)
8294 {
8295 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8296 return "THUMB_FUNC";
8297
8298 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8299 return "REGISTER";
8300
8301 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8302 return "PARISC_MILLI";
8303
8304 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8305 }
8306 else if (type >= STT_LOOS && type <= STT_HIOS)
8307 {
8308 if (elf_header.e_machine == EM_PARISC)
8309 {
8310 if (type == STT_HP_OPAQUE)
8311 return "HP_OPAQUE";
8312 if (type == STT_HP_STUB)
8313 return "HP_STUB";
8314 }
8315
8316 if (type == STT_GNU_IFUNC
8317 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8318 /* GNU/Linux is still using the default value 0. */
8319 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8320 return "IFUNC";
8321
8322 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8323 }
8324 else
8325 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8326 return buff;
8327 }
8328 }
8329
8330 static const char *
8331 get_symbol_visibility (unsigned int visibility)
8332 {
8333 switch (visibility)
8334 {
8335 case STV_DEFAULT: return "DEFAULT";
8336 case STV_INTERNAL: return "INTERNAL";
8337 case STV_HIDDEN: return "HIDDEN";
8338 case STV_PROTECTED: return "PROTECTED";
8339 default: abort ();
8340 }
8341 }
8342
8343 static const char *
8344 get_mips_symbol_other (unsigned int other)
8345 {
8346 switch (other)
8347 {
8348 case STO_OPTIONAL: return "OPTIONAL";
8349 case STO_MIPS16: return "MIPS16";
8350 case STO_MIPS_PLT: return "MIPS PLT";
8351 case STO_MIPS_PIC: return "MIPS PIC";
8352 default: return NULL;
8353 }
8354 }
8355
8356 static const char *
8357 get_ia64_symbol_other (unsigned int other)
8358 {
8359 if (is_ia64_vms ())
8360 {
8361 static char res[32];
8362
8363 res[0] = 0;
8364
8365 /* Function types is for images and .STB files only. */
8366 switch (elf_header.e_type)
8367 {
8368 case ET_DYN:
8369 case ET_EXEC:
8370 switch (VMS_ST_FUNC_TYPE (other))
8371 {
8372 case VMS_SFT_CODE_ADDR:
8373 strcat (res, " CA");
8374 break;
8375 case VMS_SFT_SYMV_IDX:
8376 strcat (res, " VEC");
8377 break;
8378 case VMS_SFT_FD:
8379 strcat (res, " FD");
8380 break;
8381 case VMS_SFT_RESERVE:
8382 strcat (res, " RSV");
8383 break;
8384 default:
8385 abort ();
8386 }
8387 break;
8388 default:
8389 break;
8390 }
8391 switch (VMS_ST_LINKAGE (other))
8392 {
8393 case VMS_STL_IGNORE:
8394 strcat (res, " IGN");
8395 break;
8396 case VMS_STL_RESERVE:
8397 strcat (res, " RSV");
8398 break;
8399 case VMS_STL_STD:
8400 strcat (res, " STD");
8401 break;
8402 case VMS_STL_LNK:
8403 strcat (res, " LNK");
8404 break;
8405 default:
8406 abort ();
8407 }
8408
8409 if (res[0] != 0)
8410 return res + 1;
8411 else
8412 return res;
8413 }
8414 return NULL;
8415 }
8416
8417 static const char *
8418 get_symbol_other (unsigned int other)
8419 {
8420 const char * result = NULL;
8421 static char buff [32];
8422
8423 if (other == 0)
8424 return "";
8425
8426 switch (elf_header.e_machine)
8427 {
8428 case EM_MIPS:
8429 result = get_mips_symbol_other (other);
8430 break;
8431 case EM_IA_64:
8432 result = get_ia64_symbol_other (other);
8433 break;
8434 default:
8435 break;
8436 }
8437
8438 if (result)
8439 return result;
8440
8441 snprintf (buff, sizeof buff, _("<other>: %x"), other);
8442 return buff;
8443 }
8444
8445 static const char *
8446 get_symbol_index_type (unsigned int type)
8447 {
8448 static char buff[32];
8449
8450 switch (type)
8451 {
8452 case SHN_UNDEF: return "UND";
8453 case SHN_ABS: return "ABS";
8454 case SHN_COMMON: return "COM";
8455 default:
8456 if (type == SHN_IA_64_ANSI_COMMON
8457 && elf_header.e_machine == EM_IA_64
8458 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8459 return "ANSI_COM";
8460 else if ((elf_header.e_machine == EM_X86_64
8461 || elf_header.e_machine == EM_L1OM)
8462 && type == SHN_X86_64_LCOMMON)
8463 return "LARGE_COM";
8464 else if (type == SHN_MIPS_SCOMMON
8465 && elf_header.e_machine == EM_MIPS)
8466 return "SCOM";
8467 else if (type == SHN_MIPS_SUNDEFINED
8468 && elf_header.e_machine == EM_MIPS)
8469 return "SUND";
8470 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8471 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8472 else if (type >= SHN_LOOS && type <= SHN_HIOS)
8473 sprintf (buff, "OS [0x%04x]", type & 0xffff);
8474 else if (type >= SHN_LORESERVE)
8475 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
8476 else
8477 sprintf (buff, "%3d", type);
8478 break;
8479 }
8480
8481 return buff;
8482 }
8483
8484 static bfd_vma *
8485 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
8486 {
8487 unsigned char * e_data;
8488 bfd_vma * i_data;
8489
8490 e_data = (unsigned char *) cmalloc (number, ent_size);
8491
8492 if (e_data == NULL)
8493 {
8494 error (_("Out of memory\n"));
8495 return NULL;
8496 }
8497
8498 if (fread (e_data, ent_size, number, file) != number)
8499 {
8500 error (_("Unable to read in dynamic data\n"));
8501 return NULL;
8502 }
8503
8504 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
8505
8506 if (i_data == NULL)
8507 {
8508 error (_("Out of memory\n"));
8509 free (e_data);
8510 return NULL;
8511 }
8512
8513 while (number--)
8514 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
8515
8516 free (e_data);
8517
8518 return i_data;
8519 }
8520
8521 static void
8522 print_dynamic_symbol (bfd_vma si, unsigned long hn)
8523 {
8524 Elf_Internal_Sym * psym;
8525 int n;
8526
8527 psym = dynamic_symbols + si;
8528
8529 n = print_vma (si, DEC_5);
8530 if (n < 5)
8531 fputs (" " + n, stdout);
8532 printf (" %3lu: ", hn);
8533 print_vma (psym->st_value, LONG_HEX);
8534 putchar (' ');
8535 print_vma (psym->st_size, DEC_5);
8536
8537 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8538 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8539 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8540 /* Check to see if any other bits in the st_other field are set.
8541 Note - displaying this information disrupts the layout of the
8542 table being generated, but for the moment this case is very
8543 rare. */
8544 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8545 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8546 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
8547 if (VALID_DYNAMIC_NAME (psym->st_name))
8548 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8549 else
8550 printf (_(" <corrupt: %14ld>"), psym->st_name);
8551 putchar ('\n');
8552 }
8553
8554 /* Dump the symbol table. */
8555 static int
8556 process_symbol_table (FILE * file)
8557 {
8558 Elf_Internal_Shdr * section;
8559 bfd_vma nbuckets = 0;
8560 bfd_vma nchains = 0;
8561 bfd_vma * buckets = NULL;
8562 bfd_vma * chains = NULL;
8563 bfd_vma ngnubuckets = 0;
8564 bfd_vma * gnubuckets = NULL;
8565 bfd_vma * gnuchains = NULL;
8566 bfd_vma gnusymidx = 0;
8567
8568 if (!do_syms && !do_dyn_syms && !do_histogram)
8569 return 1;
8570
8571 if (dynamic_info[DT_HASH]
8572 && (do_histogram
8573 || (do_using_dynamic
8574 && !do_dyn_syms
8575 && dynamic_strings != NULL)))
8576 {
8577 unsigned char nb[8];
8578 unsigned char nc[8];
8579 int hash_ent_size = 4;
8580
8581 if ((elf_header.e_machine == EM_ALPHA
8582 || elf_header.e_machine == EM_S390
8583 || elf_header.e_machine == EM_S390_OLD)
8584 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
8585 hash_ent_size = 8;
8586
8587 if (fseek (file,
8588 (archive_file_offset
8589 + offset_from_vma (file, dynamic_info[DT_HASH],
8590 sizeof nb + sizeof nc)),
8591 SEEK_SET))
8592 {
8593 error (_("Unable to seek to start of dynamic information\n"));
8594 goto no_hash;
8595 }
8596
8597 if (fread (nb, hash_ent_size, 1, file) != 1)
8598 {
8599 error (_("Failed to read in number of buckets\n"));
8600 goto no_hash;
8601 }
8602
8603 if (fread (nc, hash_ent_size, 1, file) != 1)
8604 {
8605 error (_("Failed to read in number of chains\n"));
8606 goto no_hash;
8607 }
8608
8609 nbuckets = byte_get (nb, hash_ent_size);
8610 nchains = byte_get (nc, hash_ent_size);
8611
8612 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
8613 chains = get_dynamic_data (file, nchains, hash_ent_size);
8614
8615 no_hash:
8616 if (buckets == NULL || chains == NULL)
8617 {
8618 if (do_using_dynamic)
8619 return 0;
8620 free (buckets);
8621 free (chains);
8622 buckets = NULL;
8623 chains = NULL;
8624 nbuckets = 0;
8625 nchains = 0;
8626 }
8627 }
8628
8629 if (dynamic_info_DT_GNU_HASH
8630 && (do_histogram
8631 || (do_using_dynamic
8632 && !do_dyn_syms
8633 && dynamic_strings != NULL)))
8634 {
8635 unsigned char nb[16];
8636 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
8637 bfd_vma buckets_vma;
8638
8639 if (fseek (file,
8640 (archive_file_offset
8641 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
8642 sizeof nb)),
8643 SEEK_SET))
8644 {
8645 error (_("Unable to seek to start of dynamic information\n"));
8646 goto no_gnu_hash;
8647 }
8648
8649 if (fread (nb, 16, 1, file) != 1)
8650 {
8651 error (_("Failed to read in number of buckets\n"));
8652 goto no_gnu_hash;
8653 }
8654
8655 ngnubuckets = byte_get (nb, 4);
8656 gnusymidx = byte_get (nb + 4, 4);
8657 bitmaskwords = byte_get (nb + 8, 4);
8658 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
8659 if (is_32bit_elf)
8660 buckets_vma += bitmaskwords * 4;
8661 else
8662 buckets_vma += bitmaskwords * 8;
8663
8664 if (fseek (file,
8665 (archive_file_offset
8666 + offset_from_vma (file, buckets_vma, 4)),
8667 SEEK_SET))
8668 {
8669 error (_("Unable to seek to start of dynamic information\n"));
8670 goto no_gnu_hash;
8671 }
8672
8673 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
8674
8675 if (gnubuckets == NULL)
8676 goto no_gnu_hash;
8677
8678 for (i = 0; i < ngnubuckets; i++)
8679 if (gnubuckets[i] != 0)
8680 {
8681 if (gnubuckets[i] < gnusymidx)
8682 return 0;
8683
8684 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
8685 maxchain = gnubuckets[i];
8686 }
8687
8688 if (maxchain == 0xffffffff)
8689 goto no_gnu_hash;
8690
8691 maxchain -= gnusymidx;
8692
8693 if (fseek (file,
8694 (archive_file_offset
8695 + offset_from_vma (file, buckets_vma
8696 + 4 * (ngnubuckets + maxchain), 4)),
8697 SEEK_SET))
8698 {
8699 error (_("Unable to seek to start of dynamic information\n"));
8700 goto no_gnu_hash;
8701 }
8702
8703 do
8704 {
8705 if (fread (nb, 4, 1, file) != 1)
8706 {
8707 error (_("Failed to determine last chain length\n"));
8708 goto no_gnu_hash;
8709 }
8710
8711 if (maxchain + 1 == 0)
8712 goto no_gnu_hash;
8713
8714 ++maxchain;
8715 }
8716 while ((byte_get (nb, 4) & 1) == 0);
8717
8718 if (fseek (file,
8719 (archive_file_offset
8720 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
8721 SEEK_SET))
8722 {
8723 error (_("Unable to seek to start of dynamic information\n"));
8724 goto no_gnu_hash;
8725 }
8726
8727 gnuchains = get_dynamic_data (file, maxchain, 4);
8728
8729 no_gnu_hash:
8730 if (gnuchains == NULL)
8731 {
8732 free (gnubuckets);
8733 gnubuckets = NULL;
8734 ngnubuckets = 0;
8735 if (do_using_dynamic)
8736 return 0;
8737 }
8738 }
8739
8740 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
8741 && do_syms
8742 && do_using_dynamic
8743 && dynamic_strings != NULL)
8744 {
8745 unsigned long hn;
8746
8747 if (dynamic_info[DT_HASH])
8748 {
8749 bfd_vma si;
8750
8751 printf (_("\nSymbol table for image:\n"));
8752 if (is_32bit_elf)
8753 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8754 else
8755 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8756
8757 for (hn = 0; hn < nbuckets; hn++)
8758 {
8759 if (! buckets[hn])
8760 continue;
8761
8762 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
8763 print_dynamic_symbol (si, hn);
8764 }
8765 }
8766
8767 if (dynamic_info_DT_GNU_HASH)
8768 {
8769 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
8770 if (is_32bit_elf)
8771 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8772 else
8773 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8774
8775 for (hn = 0; hn < ngnubuckets; ++hn)
8776 if (gnubuckets[hn] != 0)
8777 {
8778 bfd_vma si = gnubuckets[hn];
8779 bfd_vma off = si - gnusymidx;
8780
8781 do
8782 {
8783 print_dynamic_symbol (si, hn);
8784 si++;
8785 }
8786 while ((gnuchains[off++] & 1) == 0);
8787 }
8788 }
8789 }
8790 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
8791 {
8792 unsigned int i;
8793
8794 for (i = 0, section = section_headers;
8795 i < elf_header.e_shnum;
8796 i++, section++)
8797 {
8798 unsigned int si;
8799 char * strtab = NULL;
8800 unsigned long int strtab_size = 0;
8801 Elf_Internal_Sym * symtab;
8802 Elf_Internal_Sym * psym;
8803
8804 if ((section->sh_type != SHT_SYMTAB
8805 && section->sh_type != SHT_DYNSYM)
8806 || (!do_syms
8807 && section->sh_type == SHT_SYMTAB))
8808 continue;
8809
8810 if (section->sh_entsize == 0)
8811 {
8812 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
8813 SECTION_NAME (section));
8814 continue;
8815 }
8816
8817 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
8818 SECTION_NAME (section),
8819 (unsigned long) (section->sh_size / section->sh_entsize));
8820
8821 if (is_32bit_elf)
8822 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
8823 else
8824 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
8825
8826 symtab = GET_ELF_SYMBOLS (file, section);
8827 if (symtab == NULL)
8828 continue;
8829
8830 if (section->sh_link == elf_header.e_shstrndx)
8831 {
8832 strtab = string_table;
8833 strtab_size = string_table_length;
8834 }
8835 else if (section->sh_link < elf_header.e_shnum)
8836 {
8837 Elf_Internal_Shdr * string_sec;
8838
8839 string_sec = section_headers + section->sh_link;
8840
8841 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
8842 1, string_sec->sh_size,
8843 _("string table"));
8844 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
8845 }
8846
8847 for (si = 0, psym = symtab;
8848 si < section->sh_size / section->sh_entsize;
8849 si++, psym++)
8850 {
8851 printf ("%6d: ", si);
8852 print_vma (psym->st_value, LONG_HEX);
8853 putchar (' ');
8854 print_vma (psym->st_size, DEC_5);
8855 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8856 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8857 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8858 /* Check to see if any other bits in the st_other field are set.
8859 Note - displaying this information disrupts the layout of the
8860 table being generated, but for the moment this case is very rare. */
8861 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8862 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8863 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
8864 print_symbol (25, psym->st_name < strtab_size
8865 ? strtab + psym->st_name : _("<corrupt>"));
8866
8867 if (section->sh_type == SHT_DYNSYM &&
8868 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
8869 {
8870 unsigned char data[2];
8871 unsigned short vers_data;
8872 unsigned long offset;
8873 int is_nobits;
8874 int check_def;
8875
8876 offset = offset_from_vma
8877 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8878 sizeof data + si * sizeof (vers_data));
8879
8880 get_data (&data, file, offset + si * sizeof (vers_data),
8881 sizeof (data), 1, _("version data"));
8882
8883 vers_data = byte_get (data, 2);
8884
8885 is_nobits = (psym->st_shndx < elf_header.e_shnum
8886 && section_headers[psym->st_shndx].sh_type
8887 == SHT_NOBITS);
8888
8889 check_def = (psym->st_shndx != SHN_UNDEF);
8890
8891 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
8892 {
8893 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
8894 && (is_nobits || ! check_def))
8895 {
8896 Elf_External_Verneed evn;
8897 Elf_Internal_Verneed ivn;
8898 Elf_Internal_Vernaux ivna;
8899
8900 /* We must test both. */
8901 offset = offset_from_vma
8902 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8903 sizeof evn);
8904
8905 do
8906 {
8907 unsigned long vna_off;
8908
8909 get_data (&evn, file, offset, sizeof (evn), 1,
8910 _("version need"));
8911
8912 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8913 ivn.vn_next = BYTE_GET (evn.vn_next);
8914
8915 vna_off = offset + ivn.vn_aux;
8916
8917 do
8918 {
8919 Elf_External_Vernaux evna;
8920
8921 get_data (&evna, file, vna_off,
8922 sizeof (evna), 1,
8923 _("version need aux (3)"));
8924
8925 ivna.vna_other = BYTE_GET (evna.vna_other);
8926 ivna.vna_next = BYTE_GET (evna.vna_next);
8927 ivna.vna_name = BYTE_GET (evna.vna_name);
8928
8929 vna_off += ivna.vna_next;
8930 }
8931 while (ivna.vna_other != vers_data
8932 && ivna.vna_next != 0);
8933
8934 if (ivna.vna_other == vers_data)
8935 break;
8936
8937 offset += ivn.vn_next;
8938 }
8939 while (ivn.vn_next != 0);
8940
8941 if (ivna.vna_other == vers_data)
8942 {
8943 printf ("@%s (%d)",
8944 ivna.vna_name < strtab_size
8945 ? strtab + ivna.vna_name : _("<corrupt>"),
8946 ivna.vna_other);
8947 check_def = 0;
8948 }
8949 else if (! is_nobits)
8950 error (_("bad dynamic symbol\n"));
8951 else
8952 check_def = 1;
8953 }
8954
8955 if (check_def)
8956 {
8957 if (vers_data != 0x8001
8958 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8959 {
8960 Elf_Internal_Verdef ivd;
8961 Elf_Internal_Verdaux ivda;
8962 Elf_External_Verdaux evda;
8963 unsigned long off;
8964
8965 off = offset_from_vma
8966 (file,
8967 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8968 sizeof (Elf_External_Verdef));
8969
8970 do
8971 {
8972 Elf_External_Verdef evd;
8973
8974 get_data (&evd, file, off, sizeof (evd),
8975 1, _("version def"));
8976
8977 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8978 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8979 ivd.vd_next = BYTE_GET (evd.vd_next);
8980
8981 off += ivd.vd_next;
8982 }
8983 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
8984 && ivd.vd_next != 0);
8985
8986 off -= ivd.vd_next;
8987 off += ivd.vd_aux;
8988
8989 get_data (&evda, file, off, sizeof (evda),
8990 1, _("version def aux"));
8991
8992 ivda.vda_name = BYTE_GET (evda.vda_name);
8993
8994 if (psym->st_name != ivda.vda_name)
8995 printf ((vers_data & VERSYM_HIDDEN)
8996 ? "@%s" : "@@%s",
8997 ivda.vda_name < strtab_size
8998 ? strtab + ivda.vda_name : _("<corrupt>"));
8999 }
9000 }
9001 }
9002 }
9003
9004 putchar ('\n');
9005 }
9006
9007 free (symtab);
9008 if (strtab != string_table)
9009 free (strtab);
9010 }
9011 }
9012 else if (do_syms)
9013 printf
9014 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9015
9016 if (do_histogram && buckets != NULL)
9017 {
9018 unsigned long * lengths;
9019 unsigned long * counts;
9020 unsigned long hn;
9021 bfd_vma si;
9022 unsigned long maxlength = 0;
9023 unsigned long nzero_counts = 0;
9024 unsigned long nsyms = 0;
9025
9026 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9027 (unsigned long) nbuckets);
9028 printf (_(" Length Number %% of total Coverage\n"));
9029
9030 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9031 if (lengths == NULL)
9032 {
9033 error (_("Out of memory\n"));
9034 return 0;
9035 }
9036 for (hn = 0; hn < nbuckets; ++hn)
9037 {
9038 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9039 {
9040 ++nsyms;
9041 if (maxlength < ++lengths[hn])
9042 ++maxlength;
9043 }
9044 }
9045
9046 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9047 if (counts == NULL)
9048 {
9049 error (_("Out of memory\n"));
9050 return 0;
9051 }
9052
9053 for (hn = 0; hn < nbuckets; ++hn)
9054 ++counts[lengths[hn]];
9055
9056 if (nbuckets > 0)
9057 {
9058 unsigned long i;
9059 printf (" 0 %-10lu (%5.1f%%)\n",
9060 counts[0], (counts[0] * 100.0) / nbuckets);
9061 for (i = 1; i <= maxlength; ++i)
9062 {
9063 nzero_counts += counts[i] * i;
9064 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9065 i, counts[i], (counts[i] * 100.0) / nbuckets,
9066 (nzero_counts * 100.0) / nsyms);
9067 }
9068 }
9069
9070 free (counts);
9071 free (lengths);
9072 }
9073
9074 if (buckets != NULL)
9075 {
9076 free (buckets);
9077 free (chains);
9078 }
9079
9080 if (do_histogram && gnubuckets != NULL)
9081 {
9082 unsigned long * lengths;
9083 unsigned long * counts;
9084 unsigned long hn;
9085 unsigned long maxlength = 0;
9086 unsigned long nzero_counts = 0;
9087 unsigned long nsyms = 0;
9088
9089 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9090 if (lengths == NULL)
9091 {
9092 error (_("Out of memory\n"));
9093 return 0;
9094 }
9095
9096 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9097 (unsigned long) ngnubuckets);
9098 printf (_(" Length Number %% of total Coverage\n"));
9099
9100 for (hn = 0; hn < ngnubuckets; ++hn)
9101 if (gnubuckets[hn] != 0)
9102 {
9103 bfd_vma off, length = 1;
9104
9105 for (off = gnubuckets[hn] - gnusymidx;
9106 (gnuchains[off] & 1) == 0; ++off)
9107 ++length;
9108 lengths[hn] = length;
9109 if (length > maxlength)
9110 maxlength = length;
9111 nsyms += length;
9112 }
9113
9114 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9115 if (counts == NULL)
9116 {
9117 error (_("Out of memory\n"));
9118 return 0;
9119 }
9120
9121 for (hn = 0; hn < ngnubuckets; ++hn)
9122 ++counts[lengths[hn]];
9123
9124 if (ngnubuckets > 0)
9125 {
9126 unsigned long j;
9127 printf (" 0 %-10lu (%5.1f%%)\n",
9128 counts[0], (counts[0] * 100.0) / ngnubuckets);
9129 for (j = 1; j <= maxlength; ++j)
9130 {
9131 nzero_counts += counts[j] * j;
9132 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9133 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9134 (nzero_counts * 100.0) / nsyms);
9135 }
9136 }
9137
9138 free (counts);
9139 free (lengths);
9140 free (gnubuckets);
9141 free (gnuchains);
9142 }
9143
9144 return 1;
9145 }
9146
9147 static int
9148 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9149 {
9150 unsigned int i;
9151
9152 if (dynamic_syminfo == NULL
9153 || !do_dynamic)
9154 /* No syminfo, this is ok. */
9155 return 1;
9156
9157 /* There better should be a dynamic symbol section. */
9158 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9159 return 0;
9160
9161 if (dynamic_addr)
9162 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9163 dynamic_syminfo_offset, dynamic_syminfo_nent);
9164
9165 printf (_(" Num: Name BoundTo Flags\n"));
9166 for (i = 0; i < dynamic_syminfo_nent; ++i)
9167 {
9168 unsigned short int flags = dynamic_syminfo[i].si_flags;
9169
9170 printf ("%4d: ", i);
9171 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9172 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9173 else
9174 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9175 putchar (' ');
9176
9177 switch (dynamic_syminfo[i].si_boundto)
9178 {
9179 case SYMINFO_BT_SELF:
9180 fputs ("SELF ", stdout);
9181 break;
9182 case SYMINFO_BT_PARENT:
9183 fputs ("PARENT ", stdout);
9184 break;
9185 default:
9186 if (dynamic_syminfo[i].si_boundto > 0
9187 && dynamic_syminfo[i].si_boundto < dynamic_nent
9188 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9189 {
9190 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9191 putchar (' ' );
9192 }
9193 else
9194 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9195 break;
9196 }
9197
9198 if (flags & SYMINFO_FLG_DIRECT)
9199 printf (" DIRECT");
9200 if (flags & SYMINFO_FLG_PASSTHRU)
9201 printf (" PASSTHRU");
9202 if (flags & SYMINFO_FLG_COPY)
9203 printf (" COPY");
9204 if (flags & SYMINFO_FLG_LAZYLOAD)
9205 printf (" LAZYLOAD");
9206
9207 puts ("");
9208 }
9209
9210 return 1;
9211 }
9212
9213 /* Check to see if the given reloc needs to be handled in a target specific
9214 manner. If so then process the reloc and return TRUE otherwise return
9215 FALSE. */
9216
9217 static bfd_boolean
9218 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9219 unsigned char * start,
9220 Elf_Internal_Sym * symtab)
9221 {
9222 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9223
9224 switch (elf_header.e_machine)
9225 {
9226 case EM_MN10300:
9227 case EM_CYGNUS_MN10300:
9228 {
9229 static Elf_Internal_Sym * saved_sym = NULL;
9230
9231 switch (reloc_type)
9232 {
9233 case 34: /* R_MN10300_ALIGN */
9234 return TRUE;
9235 case 33: /* R_MN10300_SYM_DIFF */
9236 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9237 return TRUE;
9238 case 1: /* R_MN10300_32 */
9239 case 2: /* R_MN10300_16 */
9240 if (saved_sym != NULL)
9241 {
9242 bfd_vma value;
9243
9244 value = reloc->r_addend
9245 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9246 - saved_sym->st_value);
9247
9248 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9249
9250 saved_sym = NULL;
9251 return TRUE;
9252 }
9253 break;
9254 default:
9255 if (saved_sym != NULL)
9256 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9257 break;
9258 }
9259 break;
9260 }
9261 }
9262
9263 return FALSE;
9264 }
9265
9266 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9267 DWARF debug sections. This is a target specific test. Note - we do not
9268 go through the whole including-target-headers-multiple-times route, (as
9269 we have already done with <elf/h8.h>) because this would become very
9270 messy and even then this function would have to contain target specific
9271 information (the names of the relocs instead of their numeric values).
9272 FIXME: This is not the correct way to solve this problem. The proper way
9273 is to have target specific reloc sizing and typing functions created by
9274 the reloc-macros.h header, in the same way that it already creates the
9275 reloc naming functions. */
9276
9277 static bfd_boolean
9278 is_32bit_abs_reloc (unsigned int reloc_type)
9279 {
9280 switch (elf_header.e_machine)
9281 {
9282 case EM_386:
9283 case EM_486:
9284 return reloc_type == 1; /* R_386_32. */
9285 case EM_68K:
9286 return reloc_type == 1; /* R_68K_32. */
9287 case EM_860:
9288 return reloc_type == 1; /* R_860_32. */
9289 case EM_960:
9290 return reloc_type == 2; /* R_960_32. */
9291 case EM_ALPHA:
9292 return reloc_type == 1; /* R_ALPHA_REFLONG. */
9293 case EM_ARC:
9294 return reloc_type == 1; /* R_ARC_32. */
9295 case EM_ARM:
9296 return reloc_type == 2; /* R_ARM_ABS32 */
9297 case EM_AVR_OLD:
9298 case EM_AVR:
9299 return reloc_type == 1;
9300 case EM_BLACKFIN:
9301 return reloc_type == 0x12; /* R_byte4_data. */
9302 case EM_CRIS:
9303 return reloc_type == 3; /* R_CRIS_32. */
9304 case EM_CR16:
9305 case EM_CR16_OLD:
9306 return reloc_type == 3; /* R_CR16_NUM32. */
9307 case EM_CRX:
9308 return reloc_type == 15; /* R_CRX_NUM32. */
9309 case EM_CYGNUS_FRV:
9310 return reloc_type == 1;
9311 case EM_CYGNUS_D10V:
9312 case EM_D10V:
9313 return reloc_type == 6; /* R_D10V_32. */
9314 case EM_CYGNUS_D30V:
9315 case EM_D30V:
9316 return reloc_type == 12; /* R_D30V_32_NORMAL. */
9317 case EM_DLX:
9318 return reloc_type == 3; /* R_DLX_RELOC_32. */
9319 case EM_CYGNUS_FR30:
9320 case EM_FR30:
9321 return reloc_type == 3; /* R_FR30_32. */
9322 case EM_H8S:
9323 case EM_H8_300:
9324 case EM_H8_300H:
9325 return reloc_type == 1; /* R_H8_DIR32. */
9326 case EM_IA_64:
9327 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
9328 case EM_IP2K_OLD:
9329 case EM_IP2K:
9330 return reloc_type == 2; /* R_IP2K_32. */
9331 case EM_IQ2000:
9332 return reloc_type == 2; /* R_IQ2000_32. */
9333 case EM_LATTICEMICO32:
9334 return reloc_type == 3; /* R_LM32_32. */
9335 case EM_M32C_OLD:
9336 case EM_M32C:
9337 return reloc_type == 3; /* R_M32C_32. */
9338 case EM_M32R:
9339 return reloc_type == 34; /* R_M32R_32_RELA. */
9340 case EM_MCORE:
9341 return reloc_type == 1; /* R_MCORE_ADDR32. */
9342 case EM_CYGNUS_MEP:
9343 return reloc_type == 4; /* R_MEP_32. */
9344 case EM_MICROBLAZE:
9345 return reloc_type == 1; /* R_MICROBLAZE_32. */
9346 case EM_MIPS:
9347 return reloc_type == 2; /* R_MIPS_32. */
9348 case EM_MMIX:
9349 return reloc_type == 4; /* R_MMIX_32. */
9350 case EM_CYGNUS_MN10200:
9351 case EM_MN10200:
9352 return reloc_type == 1; /* R_MN10200_32. */
9353 case EM_CYGNUS_MN10300:
9354 case EM_MN10300:
9355 return reloc_type == 1; /* R_MN10300_32. */
9356 case EM_MOXIE:
9357 return reloc_type == 1; /* R_MOXIE_32. */
9358 case EM_MSP430_OLD:
9359 case EM_MSP430:
9360 return reloc_type == 1; /* R_MSP43_32. */
9361 case EM_MT:
9362 return reloc_type == 2; /* R_MT_32. */
9363 case EM_ALTERA_NIOS2:
9364 case EM_NIOS32:
9365 return reloc_type == 1; /* R_NIOS_32. */
9366 case EM_OPENRISC:
9367 case EM_OR32:
9368 return reloc_type == 1; /* R_OR32_32. */
9369 case EM_PARISC:
9370 return (reloc_type == 1 /* R_PARISC_DIR32. */
9371 || reloc_type == 41); /* R_PARISC_SECREL32. */
9372 case EM_PJ:
9373 case EM_PJ_OLD:
9374 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
9375 case EM_PPC64:
9376 return reloc_type == 1; /* R_PPC64_ADDR32. */
9377 case EM_PPC:
9378 return reloc_type == 1; /* R_PPC_ADDR32. */
9379 case EM_RX:
9380 return reloc_type == 1; /* R_RX_DIR32. */
9381 case EM_S370:
9382 return reloc_type == 1; /* R_I370_ADDR31. */
9383 case EM_S390_OLD:
9384 case EM_S390:
9385 return reloc_type == 4; /* R_S390_32. */
9386 case EM_SCORE:
9387 return reloc_type == 8; /* R_SCORE_ABS32. */
9388 case EM_SH:
9389 return reloc_type == 1; /* R_SH_DIR32. */
9390 case EM_SPARC32PLUS:
9391 case EM_SPARCV9:
9392 case EM_SPARC:
9393 return reloc_type == 3 /* R_SPARC_32. */
9394 || reloc_type == 23; /* R_SPARC_UA32. */
9395 case EM_SPU:
9396 return reloc_type == 6; /* R_SPU_ADDR32 */
9397 case EM_TI_C6000:
9398 return reloc_type == 1; /* R_C6000_ABS32. */
9399 case EM_CYGNUS_V850:
9400 case EM_V850:
9401 return reloc_type == 6; /* R_V850_ABS32. */
9402 case EM_VAX:
9403 return reloc_type == 1; /* R_VAX_32. */
9404 case EM_X86_64:
9405 case EM_L1OM:
9406 return reloc_type == 10; /* R_X86_64_32. */
9407 case EM_XC16X:
9408 case EM_C166:
9409 return reloc_type == 3; /* R_XC16C_ABS_32. */
9410 case EM_XSTORMY16:
9411 return reloc_type == 1; /* R_XSTROMY16_32. */
9412 case EM_XTENSA_OLD:
9413 case EM_XTENSA:
9414 return reloc_type == 1; /* R_XTENSA_32. */
9415 default:
9416 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9417 elf_header.e_machine);
9418 abort ();
9419 }
9420 }
9421
9422 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9423 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
9424
9425 static bfd_boolean
9426 is_32bit_pcrel_reloc (unsigned int reloc_type)
9427 {
9428 switch (elf_header.e_machine)
9429 {
9430 case EM_386:
9431 case EM_486:
9432 return reloc_type == 2; /* R_386_PC32. */
9433 case EM_68K:
9434 return reloc_type == 4; /* R_68K_PC32. */
9435 case EM_ALPHA:
9436 return reloc_type == 10; /* R_ALPHA_SREL32. */
9437 case EM_ARM:
9438 return reloc_type == 3; /* R_ARM_REL32 */
9439 case EM_MICROBLAZE:
9440 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
9441 case EM_PARISC:
9442 return reloc_type == 9; /* R_PARISC_PCREL32. */
9443 case EM_PPC:
9444 return reloc_type == 26; /* R_PPC_REL32. */
9445 case EM_PPC64:
9446 return reloc_type == 26; /* R_PPC64_REL32. */
9447 case EM_S390_OLD:
9448 case EM_S390:
9449 return reloc_type == 5; /* R_390_PC32. */
9450 case EM_SH:
9451 return reloc_type == 2; /* R_SH_REL32. */
9452 case EM_SPARC32PLUS:
9453 case EM_SPARCV9:
9454 case EM_SPARC:
9455 return reloc_type == 6; /* R_SPARC_DISP32. */
9456 case EM_SPU:
9457 return reloc_type == 13; /* R_SPU_REL32. */
9458 case EM_X86_64:
9459 case EM_L1OM:
9460 return reloc_type == 2; /* R_X86_64_PC32. */
9461 case EM_XTENSA_OLD:
9462 case EM_XTENSA:
9463 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
9464 default:
9465 /* Do not abort or issue an error message here. Not all targets use
9466 pc-relative 32-bit relocs in their DWARF debug information and we
9467 have already tested for target coverage in is_32bit_abs_reloc. A
9468 more helpful warning message will be generated by apply_relocations
9469 anyway, so just return. */
9470 return FALSE;
9471 }
9472 }
9473
9474 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9475 a 64-bit absolute RELA relocation used in DWARF debug sections. */
9476
9477 static bfd_boolean
9478 is_64bit_abs_reloc (unsigned int reloc_type)
9479 {
9480 switch (elf_header.e_machine)
9481 {
9482 case EM_ALPHA:
9483 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
9484 case EM_IA_64:
9485 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
9486 case EM_PARISC:
9487 return reloc_type == 80; /* R_PARISC_DIR64. */
9488 case EM_PPC64:
9489 return reloc_type == 38; /* R_PPC64_ADDR64. */
9490 case EM_SPARC32PLUS:
9491 case EM_SPARCV9:
9492 case EM_SPARC:
9493 return reloc_type == 54; /* R_SPARC_UA64. */
9494 case EM_X86_64:
9495 case EM_L1OM:
9496 return reloc_type == 1; /* R_X86_64_64. */
9497 case EM_S390_OLD:
9498 case EM_S390:
9499 return reloc_type == 22; /* R_S390_64 */
9500 case EM_MIPS:
9501 return reloc_type == 18; /* R_MIPS_64 */
9502 default:
9503 return FALSE;
9504 }
9505 }
9506
9507 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
9508 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
9509
9510 static bfd_boolean
9511 is_64bit_pcrel_reloc (unsigned int reloc_type)
9512 {
9513 switch (elf_header.e_machine)
9514 {
9515 case EM_ALPHA:
9516 return reloc_type == 11; /* R_ALPHA_SREL64 */
9517 case EM_IA_64:
9518 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB */
9519 case EM_PARISC:
9520 return reloc_type == 72; /* R_PARISC_PCREL64 */
9521 case EM_PPC64:
9522 return reloc_type == 44; /* R_PPC64_REL64 */
9523 case EM_SPARC32PLUS:
9524 case EM_SPARCV9:
9525 case EM_SPARC:
9526 return reloc_type == 46; /* R_SPARC_DISP64 */
9527 case EM_X86_64:
9528 case EM_L1OM:
9529 return reloc_type == 24; /* R_X86_64_PC64 */
9530 case EM_S390_OLD:
9531 case EM_S390:
9532 return reloc_type == 23; /* R_S390_PC64 */
9533 default:
9534 return FALSE;
9535 }
9536 }
9537
9538 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9539 a 24-bit absolute RELA relocation used in DWARF debug sections. */
9540
9541 static bfd_boolean
9542 is_24bit_abs_reloc (unsigned int reloc_type)
9543 {
9544 switch (elf_header.e_machine)
9545 {
9546 case EM_CYGNUS_MN10200:
9547 case EM_MN10200:
9548 return reloc_type == 4; /* R_MN10200_24. */
9549 default:
9550 return FALSE;
9551 }
9552 }
9553
9554 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9555 a 16-bit absolute RELA relocation used in DWARF debug sections. */
9556
9557 static bfd_boolean
9558 is_16bit_abs_reloc (unsigned int reloc_type)
9559 {
9560 switch (elf_header.e_machine)
9561 {
9562 case EM_AVR_OLD:
9563 case EM_AVR:
9564 return reloc_type == 4; /* R_AVR_16. */
9565 case EM_CYGNUS_D10V:
9566 case EM_D10V:
9567 return reloc_type == 3; /* R_D10V_16. */
9568 case EM_H8S:
9569 case EM_H8_300:
9570 case EM_H8_300H:
9571 return reloc_type == R_H8_DIR16;
9572 case EM_IP2K_OLD:
9573 case EM_IP2K:
9574 return reloc_type == 1; /* R_IP2K_16. */
9575 case EM_M32C_OLD:
9576 case EM_M32C:
9577 return reloc_type == 1; /* R_M32C_16 */
9578 case EM_MSP430_OLD:
9579 case EM_MSP430:
9580 return reloc_type == 5; /* R_MSP430_16_BYTE. */
9581 case EM_ALTERA_NIOS2:
9582 case EM_NIOS32:
9583 return reloc_type == 9; /* R_NIOS_16. */
9584 case EM_TI_C6000:
9585 return reloc_type == 2; /* R_C6000_ABS16. */
9586 case EM_XC16X:
9587 case EM_C166:
9588 return reloc_type == 2; /* R_XC16C_ABS_16. */
9589 default:
9590 return FALSE;
9591 }
9592 }
9593
9594 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
9595 relocation entries (possibly formerly used for SHT_GROUP sections). */
9596
9597 static bfd_boolean
9598 is_none_reloc (unsigned int reloc_type)
9599 {
9600 switch (elf_header.e_machine)
9601 {
9602 case EM_68K: /* R_68K_NONE. */
9603 case EM_386: /* R_386_NONE. */
9604 case EM_SPARC32PLUS:
9605 case EM_SPARCV9:
9606 case EM_SPARC: /* R_SPARC_NONE. */
9607 case EM_MIPS: /* R_MIPS_NONE. */
9608 case EM_PARISC: /* R_PARISC_NONE. */
9609 case EM_ALPHA: /* R_ALPHA_NONE. */
9610 case EM_PPC: /* R_PPC_NONE. */
9611 case EM_PPC64: /* R_PPC64_NONE. */
9612 case EM_ARM: /* R_ARM_NONE. */
9613 case EM_IA_64: /* R_IA64_NONE. */
9614 case EM_SH: /* R_SH_NONE. */
9615 case EM_S390_OLD:
9616 case EM_S390: /* R_390_NONE. */
9617 case EM_CRIS: /* R_CRIS_NONE. */
9618 case EM_X86_64: /* R_X86_64_NONE. */
9619 case EM_L1OM: /* R_X86_64_NONE. */
9620 case EM_MN10300: /* R_MN10300_NONE. */
9621 case EM_MOXIE: /* R_MOXIE_NONE. */
9622 case EM_M32R: /* R_M32R_NONE. */
9623 case EM_TI_C6000:/* R_C6000_NONE. */
9624 case EM_XC16X:
9625 case EM_C166: /* R_XC16X_NONE. */
9626 return reloc_type == 0;
9627 case EM_XTENSA_OLD:
9628 case EM_XTENSA:
9629 return (reloc_type == 0 /* R_XTENSA_NONE. */
9630 || reloc_type == 17 /* R_XTENSA_DIFF8. */
9631 || reloc_type == 18 /* R_XTENSA_DIFF16. */
9632 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
9633 }
9634 return FALSE;
9635 }
9636
9637 /* Apply relocations to a section.
9638 Note: So far support has been added only for those relocations
9639 which can be found in debug sections.
9640 FIXME: Add support for more relocations ? */
9641
9642 static void
9643 apply_relocations (void * file,
9644 Elf_Internal_Shdr * section,
9645 unsigned char * start)
9646 {
9647 Elf_Internal_Shdr * relsec;
9648 unsigned char * end = start + section->sh_size;
9649
9650 if (elf_header.e_type != ET_REL)
9651 return;
9652
9653 /* Find the reloc section associated with the section. */
9654 for (relsec = section_headers;
9655 relsec < section_headers + elf_header.e_shnum;
9656 ++relsec)
9657 {
9658 bfd_boolean is_rela;
9659 unsigned long num_relocs;
9660 Elf_Internal_Rela * relocs;
9661 Elf_Internal_Rela * rp;
9662 Elf_Internal_Shdr * symsec;
9663 Elf_Internal_Sym * symtab;
9664 Elf_Internal_Sym * sym;
9665
9666 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9667 || relsec->sh_info >= elf_header.e_shnum
9668 || section_headers + relsec->sh_info != section
9669 || relsec->sh_size == 0
9670 || relsec->sh_link >= elf_header.e_shnum)
9671 continue;
9672
9673 is_rela = relsec->sh_type == SHT_RELA;
9674
9675 if (is_rela)
9676 {
9677 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
9678 relsec->sh_size, & relocs, & num_relocs))
9679 return;
9680 }
9681 else
9682 {
9683 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
9684 relsec->sh_size, & relocs, & num_relocs))
9685 return;
9686 }
9687
9688 /* SH uses RELA but uses in place value instead of the addend field. */
9689 if (elf_header.e_machine == EM_SH)
9690 is_rela = FALSE;
9691
9692 symsec = section_headers + relsec->sh_link;
9693 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec);
9694
9695 for (rp = relocs; rp < relocs + num_relocs; ++rp)
9696 {
9697 bfd_vma addend;
9698 unsigned int reloc_type;
9699 unsigned int reloc_size;
9700 unsigned char * rloc;
9701
9702 reloc_type = get_reloc_type (rp->r_info);
9703
9704 if (target_specific_reloc_handling (rp, start, symtab))
9705 continue;
9706 else if (is_none_reloc (reloc_type))
9707 continue;
9708 else if (is_32bit_abs_reloc (reloc_type)
9709 || is_32bit_pcrel_reloc (reloc_type))
9710 reloc_size = 4;
9711 else if (is_64bit_abs_reloc (reloc_type)
9712 || is_64bit_pcrel_reloc (reloc_type))
9713 reloc_size = 8;
9714 else if (is_24bit_abs_reloc (reloc_type))
9715 reloc_size = 3;
9716 else if (is_16bit_abs_reloc (reloc_type))
9717 reloc_size = 2;
9718 else
9719 {
9720 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
9721 reloc_type, SECTION_NAME (section));
9722 continue;
9723 }
9724
9725 rloc = start + rp->r_offset;
9726 if ((rloc + reloc_size) > end)
9727 {
9728 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
9729 (unsigned long) rp->r_offset,
9730 SECTION_NAME (section));
9731 continue;
9732 }
9733
9734 sym = symtab + get_reloc_symindex (rp->r_info);
9735
9736 /* If the reloc has a symbol associated with it,
9737 make sure that it is of an appropriate type.
9738
9739 Relocations against symbols without type can happen.
9740 Gcc -feliminate-dwarf2-dups may generate symbols
9741 without type for debug info.
9742
9743 Icc generates relocations against function symbols
9744 instead of local labels.
9745
9746 Relocations against object symbols can happen, eg when
9747 referencing a global array. For an example of this see
9748 the _clz.o binary in libgcc.a. */
9749 if (sym != symtab
9750 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
9751 {
9752 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
9753 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
9754 (long int)(rp - relocs),
9755 SECTION_NAME (relsec));
9756 continue;
9757 }
9758
9759 addend = 0;
9760 if (is_rela)
9761 addend += rp->r_addend;
9762 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
9763 partial_inplace. */
9764 if (!is_rela
9765 || (elf_header.e_machine == EM_XTENSA
9766 && reloc_type == 1)
9767 || ((elf_header.e_machine == EM_PJ
9768 || elf_header.e_machine == EM_PJ_OLD)
9769 && reloc_type == 1)
9770 || ((elf_header.e_machine == EM_D30V
9771 || elf_header.e_machine == EM_CYGNUS_D30V)
9772 && reloc_type == 12))
9773 addend += byte_get (rloc, reloc_size);
9774
9775 if (is_32bit_pcrel_reloc (reloc_type)
9776 || is_64bit_pcrel_reloc (reloc_type))
9777 {
9778 /* On HPPA, all pc-relative relocations are biased by 8. */
9779 if (elf_header.e_machine == EM_PARISC)
9780 addend -= 8;
9781 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
9782 reloc_size);
9783 }
9784 else
9785 byte_put (rloc, addend + sym->st_value, reloc_size);
9786 }
9787
9788 free (symtab);
9789 free (relocs);
9790 break;
9791 }
9792 }
9793
9794 #ifdef SUPPORT_DISASSEMBLY
9795 static int
9796 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
9797 {
9798 printf (_("\nAssembly dump of section %s\n"),
9799 SECTION_NAME (section));
9800
9801 /* XXX -- to be done --- XXX */
9802
9803 return 1;
9804 }
9805 #endif
9806
9807 /* Reads in the contents of SECTION from FILE, returning a pointer
9808 to a malloc'ed buffer or NULL if something went wrong. */
9809
9810 static char *
9811 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
9812 {
9813 bfd_size_type num_bytes;
9814
9815 num_bytes = section->sh_size;
9816
9817 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
9818 {
9819 printf (_("\nSection '%s' has no data to dump.\n"),
9820 SECTION_NAME (section));
9821 return NULL;
9822 }
9823
9824 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
9825 _("section contents"));
9826 }
9827
9828
9829 static void
9830 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
9831 {
9832 Elf_Internal_Shdr * relsec;
9833 bfd_size_type num_bytes;
9834 char * data;
9835 char * end;
9836 char * start;
9837 char * name = SECTION_NAME (section);
9838 bfd_boolean some_strings_shown;
9839
9840 start = get_section_contents (section, file);
9841 if (start == NULL)
9842 return;
9843
9844 printf (_("\nString dump of section '%s':\n"), name);
9845
9846 /* If the section being dumped has relocations against it the user might
9847 be expecting these relocations to have been applied. Check for this
9848 case and issue a warning message in order to avoid confusion.
9849 FIXME: Maybe we ought to have an option that dumps a section with
9850 relocs applied ? */
9851 for (relsec = section_headers;
9852 relsec < section_headers + elf_header.e_shnum;
9853 ++relsec)
9854 {
9855 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9856 || relsec->sh_info >= elf_header.e_shnum
9857 || section_headers + relsec->sh_info != section
9858 || relsec->sh_size == 0
9859 || relsec->sh_link >= elf_header.e_shnum)
9860 continue;
9861
9862 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
9863 break;
9864 }
9865
9866 num_bytes = section->sh_size;
9867 data = start;
9868 end = start + num_bytes;
9869 some_strings_shown = FALSE;
9870
9871 while (data < end)
9872 {
9873 while (!ISPRINT (* data))
9874 if (++ data >= end)
9875 break;
9876
9877 if (data < end)
9878 {
9879 #ifndef __MSVCRT__
9880 /* PR 11128: Use two separate invocations in order to work
9881 around bugs in the Solaris 8 implementation of printf. */
9882 printf (" [%6tx] ", data - start);
9883 printf ("%s\n", data);
9884 #else
9885 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
9886 #endif
9887 data += strlen (data);
9888 some_strings_shown = TRUE;
9889 }
9890 }
9891
9892 if (! some_strings_shown)
9893 printf (_(" No strings found in this section."));
9894
9895 free (start);
9896
9897 putchar ('\n');
9898 }
9899
9900 static void
9901 dump_section_as_bytes (Elf_Internal_Shdr * section,
9902 FILE * file,
9903 bfd_boolean relocate)
9904 {
9905 Elf_Internal_Shdr * relsec;
9906 bfd_size_type bytes;
9907 bfd_vma addr;
9908 unsigned char * data;
9909 unsigned char * start;
9910
9911 start = (unsigned char *) get_section_contents (section, file);
9912 if (start == NULL)
9913 return;
9914
9915 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
9916
9917 if (relocate)
9918 {
9919 apply_relocations (file, section, start);
9920 }
9921 else
9922 {
9923 /* If the section being dumped has relocations against it the user might
9924 be expecting these relocations to have been applied. Check for this
9925 case and issue a warning message in order to avoid confusion.
9926 FIXME: Maybe we ought to have an option that dumps a section with
9927 relocs applied ? */
9928 for (relsec = section_headers;
9929 relsec < section_headers + elf_header.e_shnum;
9930 ++relsec)
9931 {
9932 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9933 || relsec->sh_info >= elf_header.e_shnum
9934 || section_headers + relsec->sh_info != section
9935 || relsec->sh_size == 0
9936 || relsec->sh_link >= elf_header.e_shnum)
9937 continue;
9938
9939 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
9940 break;
9941 }
9942 }
9943
9944 addr = section->sh_addr;
9945 bytes = section->sh_size;
9946 data = start;
9947
9948 while (bytes)
9949 {
9950 int j;
9951 int k;
9952 int lbytes;
9953
9954 lbytes = (bytes > 16 ? 16 : bytes);
9955
9956 printf (" 0x%8.8lx ", (unsigned long) addr);
9957
9958 for (j = 0; j < 16; j++)
9959 {
9960 if (j < lbytes)
9961 printf ("%2.2x", data[j]);
9962 else
9963 printf (" ");
9964
9965 if ((j & 3) == 3)
9966 printf (" ");
9967 }
9968
9969 for (j = 0; j < lbytes; j++)
9970 {
9971 k = data[j];
9972 if (k >= ' ' && k < 0x7f)
9973 printf ("%c", k);
9974 else
9975 printf (".");
9976 }
9977
9978 putchar ('\n');
9979
9980 data += lbytes;
9981 addr += lbytes;
9982 bytes -= lbytes;
9983 }
9984
9985 free (start);
9986
9987 putchar ('\n');
9988 }
9989
9990 /* Uncompresses a section that was compressed using zlib, in place.
9991 This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
9992
9993 static int
9994 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
9995 dwarf_size_type *size ATTRIBUTE_UNUSED)
9996 {
9997 #ifndef HAVE_ZLIB_H
9998 return FALSE;
9999 #else
10000 dwarf_size_type compressed_size = *size;
10001 unsigned char * compressed_buffer = *buffer;
10002 dwarf_size_type uncompressed_size;
10003 unsigned char * uncompressed_buffer;
10004 z_stream strm;
10005 int rc;
10006 dwarf_size_type header_size = 12;
10007
10008 /* Read the zlib header. In this case, it should be "ZLIB" followed
10009 by the uncompressed section size, 8 bytes in big-endian order. */
10010 if (compressed_size < header_size
10011 || ! streq ((char *) compressed_buffer, "ZLIB"))
10012 return 0;
10013
10014 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10015 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10016 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10017 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10018 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10019 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10020 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10021 uncompressed_size += compressed_buffer[11];
10022
10023 /* It is possible the section consists of several compressed
10024 buffers concatenated together, so we uncompress in a loop. */
10025 strm.zalloc = NULL;
10026 strm.zfree = NULL;
10027 strm.opaque = NULL;
10028 strm.avail_in = compressed_size - header_size;
10029 strm.next_in = (Bytef *) compressed_buffer + header_size;
10030 strm.avail_out = uncompressed_size;
10031 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10032
10033 rc = inflateInit (& strm);
10034 while (strm.avail_in > 0)
10035 {
10036 if (rc != Z_OK)
10037 goto fail;
10038 strm.next_out = ((Bytef *) uncompressed_buffer
10039 + (uncompressed_size - strm.avail_out));
10040 rc = inflate (&strm, Z_FINISH);
10041 if (rc != Z_STREAM_END)
10042 goto fail;
10043 rc = inflateReset (& strm);
10044 }
10045 rc = inflateEnd (& strm);
10046 if (rc != Z_OK
10047 || strm.avail_out != 0)
10048 goto fail;
10049
10050 free (compressed_buffer);
10051 *buffer = uncompressed_buffer;
10052 *size = uncompressed_size;
10053 return 1;
10054
10055 fail:
10056 free (uncompressed_buffer);
10057 return 0;
10058 #endif /* HAVE_ZLIB_H */
10059 }
10060
10061 static int
10062 load_specific_debug_section (enum dwarf_section_display_enum debug,
10063 Elf_Internal_Shdr * sec, void * file)
10064 {
10065 struct dwarf_section * section = &debug_displays [debug].section;
10066 char buf [64];
10067 int section_is_compressed;
10068
10069 /* If it is already loaded, do nothing. */
10070 if (section->start != NULL)
10071 return 1;
10072
10073 section_is_compressed = section->name == section->compressed_name;
10074
10075 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10076 section->address = sec->sh_addr;
10077 section->size = sec->sh_size;
10078 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10079 sec->sh_offset, 1,
10080 sec->sh_size, buf);
10081 if (section->start == NULL)
10082 return 0;
10083
10084 if (section_is_compressed)
10085 {
10086 if (! uncompress_section_contents (&section->start, &section->size))
10087 return 0;
10088 sec->sh_size = section->size;
10089 }
10090
10091 if (debug_displays [debug].relocate)
10092 apply_relocations ((FILE *) file, sec, section->start);
10093
10094 return 1;
10095 }
10096
10097 int
10098 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10099 {
10100 struct dwarf_section * section = &debug_displays [debug].section;
10101 Elf_Internal_Shdr * sec;
10102
10103 /* Locate the debug section. */
10104 sec = find_section (section->uncompressed_name);
10105 if (sec != NULL)
10106 section->name = section->uncompressed_name;
10107 else
10108 {
10109 sec = find_section (section->compressed_name);
10110 if (sec != NULL)
10111 section->name = section->compressed_name;
10112 }
10113 if (sec == NULL)
10114 return 0;
10115
10116 return load_specific_debug_section (debug, sec, (FILE *) file);
10117 }
10118
10119 void
10120 free_debug_section (enum dwarf_section_display_enum debug)
10121 {
10122 struct dwarf_section * section = &debug_displays [debug].section;
10123
10124 if (section->start == NULL)
10125 return;
10126
10127 free ((char *) section->start);
10128 section->start = NULL;
10129 section->address = 0;
10130 section->size = 0;
10131 }
10132
10133 static int
10134 display_debug_section (Elf_Internal_Shdr * section, FILE * file)
10135 {
10136 char * name = SECTION_NAME (section);
10137 bfd_size_type length;
10138 int result = 1;
10139 int i;
10140
10141 length = section->sh_size;
10142 if (length == 0)
10143 {
10144 printf (_("\nSection '%s' has no debugging data.\n"), name);
10145 return 0;
10146 }
10147 if (section->sh_type == SHT_NOBITS)
10148 {
10149 /* There is no point in dumping the contents of a debugging section
10150 which has the NOBITS type - the bits in the file will be random.
10151 This can happen when a file containing a .eh_frame section is
10152 stripped with the --only-keep-debug command line option. */
10153 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10154 return 0;
10155 }
10156
10157 if (const_strneq (name, ".gnu.linkonce.wi."))
10158 name = ".debug_info";
10159
10160 /* See if we know how to display the contents of this section. */
10161 for (i = 0; i < max; i++)
10162 if (streq (debug_displays[i].section.uncompressed_name, name)
10163 || streq (debug_displays[i].section.compressed_name, name))
10164 {
10165 struct dwarf_section * sec = &debug_displays [i].section;
10166 int secondary = (section != find_section (name));
10167
10168 if (secondary)
10169 free_debug_section ((enum dwarf_section_display_enum) i);
10170
10171 if (streq (sec->uncompressed_name, name))
10172 sec->name = sec->uncompressed_name;
10173 else
10174 sec->name = sec->compressed_name;
10175 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10176 section, file))
10177 {
10178 result &= debug_displays[i].display (sec, file);
10179
10180 if (secondary || (i != info && i != abbrev))
10181 free_debug_section ((enum dwarf_section_display_enum) i);
10182 }
10183
10184 break;
10185 }
10186
10187 if (i == max)
10188 {
10189 printf (_("Unrecognized debug section: %s\n"), name);
10190 result = 0;
10191 }
10192
10193 return result;
10194 }
10195
10196 /* Set DUMP_SECTS for all sections where dumps were requested
10197 based on section name. */
10198
10199 static void
10200 initialise_dumps_byname (void)
10201 {
10202 struct dump_list_entry * cur;
10203
10204 for (cur = dump_sects_byname; cur; cur = cur->next)
10205 {
10206 unsigned int i;
10207 int any;
10208
10209 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10210 if (streq (SECTION_NAME (section_headers + i), cur->name))
10211 {
10212 request_dump_bynumber (i, cur->type);
10213 any = 1;
10214 }
10215
10216 if (!any)
10217 warn (_("Section '%s' was not dumped because it does not exist!\n"),
10218 cur->name);
10219 }
10220 }
10221
10222 static void
10223 process_section_contents (FILE * file)
10224 {
10225 Elf_Internal_Shdr * section;
10226 unsigned int i;
10227
10228 if (! do_dump)
10229 return;
10230
10231 initialise_dumps_byname ();
10232
10233 for (i = 0, section = section_headers;
10234 i < elf_header.e_shnum && i < num_dump_sects;
10235 i++, section++)
10236 {
10237 #ifdef SUPPORT_DISASSEMBLY
10238 if (dump_sects[i] & DISASS_DUMP)
10239 disassemble_section (section, file);
10240 #endif
10241 if (dump_sects[i] & HEX_DUMP)
10242 dump_section_as_bytes (section, file, FALSE);
10243
10244 if (dump_sects[i] & RELOC_DUMP)
10245 dump_section_as_bytes (section, file, TRUE);
10246
10247 if (dump_sects[i] & STRING_DUMP)
10248 dump_section_as_strings (section, file);
10249
10250 if (dump_sects[i] & DEBUG_DUMP)
10251 display_debug_section (section, file);
10252 }
10253
10254 /* Check to see if the user requested a
10255 dump of a section that does not exist. */
10256 while (i++ < num_dump_sects)
10257 if (dump_sects[i])
10258 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10259 }
10260
10261 static void
10262 process_mips_fpe_exception (int mask)
10263 {
10264 if (mask)
10265 {
10266 int first = 1;
10267 if (mask & OEX_FPU_INEX)
10268 fputs ("INEX", stdout), first = 0;
10269 if (mask & OEX_FPU_UFLO)
10270 printf ("%sUFLO", first ? "" : "|"), first = 0;
10271 if (mask & OEX_FPU_OFLO)
10272 printf ("%sOFLO", first ? "" : "|"), first = 0;
10273 if (mask & OEX_FPU_DIV0)
10274 printf ("%sDIV0", first ? "" : "|"), first = 0;
10275 if (mask & OEX_FPU_INVAL)
10276 printf ("%sINVAL", first ? "" : "|");
10277 }
10278 else
10279 fputs ("0", stdout);
10280 }
10281
10282 /* ARM EABI attributes section. */
10283 typedef struct
10284 {
10285 int tag;
10286 const char * name;
10287 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
10288 int type;
10289 const char ** table;
10290 } arm_attr_public_tag;
10291
10292 static const char * arm_attr_tag_CPU_arch[] =
10293 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10294 "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
10295 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10296 static const char * arm_attr_tag_THUMB_ISA_use[] =
10297 {"No", "Thumb-1", "Thumb-2"};
10298 static const char * arm_attr_tag_FP_arch[] =
10299 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
10300 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10301 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10302 {"No", "NEONv1", "NEONv1 with Fused-MAC"};
10303 static const char * arm_attr_tag_PCS_config[] =
10304 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10305 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10306 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10307 {"V6", "SB", "TLS", "Unused"};
10308 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10309 {"Absolute", "PC-relative", "SB-relative", "None"};
10310 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10311 {"Absolute", "PC-relative", "None"};
10312 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10313 {"None", "direct", "GOT-indirect"};
10314 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10315 {"None", "??? 1", "2", "??? 3", "4"};
10316 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10317 static const char * arm_attr_tag_ABI_FP_denormal[] =
10318 {"Unused", "Needed", "Sign only"};
10319 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10320 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10321 static const char * arm_attr_tag_ABI_FP_number_model[] =
10322 {"Unused", "Finite", "RTABI", "IEEE 754"};
10323 static const char * arm_attr_tag_ABI_enum_size[] =
10324 {"Unused", "small", "int", "forced to int"};
10325 static const char * arm_attr_tag_ABI_HardFP_use[] =
10326 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10327 static const char * arm_attr_tag_ABI_VFP_args[] =
10328 {"AAPCS", "VFP registers", "custom"};
10329 static const char * arm_attr_tag_ABI_WMMX_args[] =
10330 {"AAPCS", "WMMX registers", "custom"};
10331 static const char * arm_attr_tag_ABI_optimization_goals[] =
10332 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10333 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10334 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10335 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10336 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10337 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10338 static const char * arm_attr_tag_FP_HP_extension[] =
10339 {"Not Allowed", "Allowed"};
10340 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10341 {"None", "IEEE 754", "Alternative Format"};
10342 static const char * arm_attr_tag_MPextension_use[] =
10343 {"Not Allowed", "Allowed"};
10344 static const char * arm_attr_tag_DIV_use[] =
10345 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10346 "Allowed in v7-A with integer division extension"};
10347 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10348 static const char * arm_attr_tag_Virtualization_use[] =
10349 {"Not Allowed", "TrustZone", "Virtualization Extensions",
10350 "TrustZone and Virtualization Extensions"};
10351 static const char * arm_attr_tag_MPextension_use_legacy[] =
10352 {"Not Allowed", "Allowed"};
10353
10354 #define LOOKUP(id, name) \
10355 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10356 static arm_attr_public_tag arm_attr_public_tags[] =
10357 {
10358 {4, "CPU_raw_name", 1, NULL},
10359 {5, "CPU_name", 1, NULL},
10360 LOOKUP(6, CPU_arch),
10361 {7, "CPU_arch_profile", 0, NULL},
10362 LOOKUP(8, ARM_ISA_use),
10363 LOOKUP(9, THUMB_ISA_use),
10364 LOOKUP(10, FP_arch),
10365 LOOKUP(11, WMMX_arch),
10366 LOOKUP(12, Advanced_SIMD_arch),
10367 LOOKUP(13, PCS_config),
10368 LOOKUP(14, ABI_PCS_R9_use),
10369 LOOKUP(15, ABI_PCS_RW_data),
10370 LOOKUP(16, ABI_PCS_RO_data),
10371 LOOKUP(17, ABI_PCS_GOT_use),
10372 LOOKUP(18, ABI_PCS_wchar_t),
10373 LOOKUP(19, ABI_FP_rounding),
10374 LOOKUP(20, ABI_FP_denormal),
10375 LOOKUP(21, ABI_FP_exceptions),
10376 LOOKUP(22, ABI_FP_user_exceptions),
10377 LOOKUP(23, ABI_FP_number_model),
10378 {24, "ABI_align_needed", 0, NULL},
10379 {25, "ABI_align_preserved", 0, NULL},
10380 LOOKUP(26, ABI_enum_size),
10381 LOOKUP(27, ABI_HardFP_use),
10382 LOOKUP(28, ABI_VFP_args),
10383 LOOKUP(29, ABI_WMMX_args),
10384 LOOKUP(30, ABI_optimization_goals),
10385 LOOKUP(31, ABI_FP_optimization_goals),
10386 {32, "compatibility", 0, NULL},
10387 LOOKUP(34, CPU_unaligned_access),
10388 LOOKUP(36, FP_HP_extension),
10389 LOOKUP(38, ABI_FP_16bit_format),
10390 LOOKUP(42, MPextension_use),
10391 LOOKUP(44, DIV_use),
10392 {64, "nodefaults", 0, NULL},
10393 {65, "also_compatible_with", 0, NULL},
10394 LOOKUP(66, T2EE_use),
10395 {67, "conformance", 1, NULL},
10396 LOOKUP(68, Virtualization_use),
10397 LOOKUP(70, MPextension_use_legacy)
10398 };
10399 #undef LOOKUP
10400
10401 static unsigned char *
10402 display_arm_attribute (unsigned char * p)
10403 {
10404 int tag;
10405 unsigned int len;
10406 int val;
10407 arm_attr_public_tag * attr;
10408 unsigned i;
10409 int type;
10410
10411 tag = read_uleb128 (p, &len);
10412 p += len;
10413 attr = NULL;
10414 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
10415 {
10416 if (arm_attr_public_tags[i].tag == tag)
10417 {
10418 attr = &arm_attr_public_tags[i];
10419 break;
10420 }
10421 }
10422
10423 if (attr)
10424 {
10425 printf (" Tag_%s: ", attr->name);
10426 switch (attr->type)
10427 {
10428 case 0:
10429 switch (tag)
10430 {
10431 case 7: /* Tag_CPU_arch_profile. */
10432 val = read_uleb128 (p, &len);
10433 p += len;
10434 switch (val)
10435 {
10436 case 0: printf (_("None\n")); break;
10437 case 'A': printf (_("Application\n")); break;
10438 case 'R': printf (_("Realtime\n")); break;
10439 case 'M': printf (_("Microcontroller\n")); break;
10440 case 'S': printf (_("Application or Realtime\n")); break;
10441 default: printf ("??? (%d)\n", val); break;
10442 }
10443 break;
10444
10445 case 24: /* Tag_align_needed. */
10446 val = read_uleb128 (p, &len);
10447 p += len;
10448 switch (val)
10449 {
10450 case 0: printf (_("None\n")); break;
10451 case 1: printf (_("8-byte\n")); break;
10452 case 2: printf (_("4-byte\n")); break;
10453 case 3: printf ("??? 3\n"); break;
10454 default:
10455 if (val <= 12)
10456 printf (_("8-byte and up to %d-byte extended\n"),
10457 1 << val);
10458 else
10459 printf ("??? (%d)\n", val);
10460 break;
10461 }
10462 break;
10463
10464 case 25: /* Tag_align_preserved. */
10465 val = read_uleb128 (p, &len);
10466 p += len;
10467 switch (val)
10468 {
10469 case 0: printf (_("None\n")); break;
10470 case 1: printf (_("8-byte, except leaf SP\n")); break;
10471 case 2: printf (_("8-byte\n")); break;
10472 case 3: printf ("??? 3\n"); break;
10473 default:
10474 if (val <= 12)
10475 printf (_("8-byte and up to %d-byte extended\n"),
10476 1 << val);
10477 else
10478 printf ("??? (%d)\n", val);
10479 break;
10480 }
10481 break;
10482
10483 case 32: /* Tag_compatibility. */
10484 val = read_uleb128 (p, &len);
10485 p += len;
10486 printf (_("flag = %d, vendor = %s\n"), val, p);
10487 p += strlen ((char *) p) + 1;
10488 break;
10489
10490 case 64: /* Tag_nodefaults. */
10491 p++;
10492 printf (_("True\n"));
10493 break;
10494
10495 case 65: /* Tag_also_compatible_with. */
10496 val = read_uleb128 (p, &len);
10497 p += len;
10498 if (val == 6 /* Tag_CPU_arch. */)
10499 {
10500 val = read_uleb128 (p, &len);
10501 p += len;
10502 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
10503 printf ("??? (%d)\n", val);
10504 else
10505 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
10506 }
10507 else
10508 printf ("???\n");
10509 while (*(p++) != '\0' /* NUL terminator. */);
10510 break;
10511
10512 default:
10513 abort ();
10514 }
10515 return p;
10516
10517 case 1:
10518 case 2:
10519 type = attr->type;
10520 break;
10521
10522 default:
10523 assert (attr->type & 0x80);
10524 val = read_uleb128 (p, &len);
10525 p += len;
10526 type = attr->type & 0x7f;
10527 if (val >= type)
10528 printf ("??? (%d)\n", val);
10529 else
10530 printf ("%s\n", attr->table[val]);
10531 return p;
10532 }
10533 }
10534 else
10535 {
10536 if (tag & 1)
10537 type = 1; /* String. */
10538 else
10539 type = 2; /* uleb128. */
10540 printf (" Tag_unknown_%d: ", tag);
10541 }
10542
10543 if (type == 1)
10544 {
10545 printf ("\"%s\"\n", p);
10546 p += strlen ((char *) p) + 1;
10547 }
10548 else
10549 {
10550 val = read_uleb128 (p, &len);
10551 p += len;
10552 printf ("%d (0x%x)\n", val, val);
10553 }
10554
10555 return p;
10556 }
10557
10558 static unsigned char *
10559 display_gnu_attribute (unsigned char * p,
10560 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10561 {
10562 int tag;
10563 unsigned int len;
10564 int val;
10565 int type;
10566
10567 tag = read_uleb128 (p, &len);
10568 p += len;
10569
10570 /* Tag_compatibility is the only generic GNU attribute defined at
10571 present. */
10572 if (tag == 32)
10573 {
10574 val = read_uleb128 (p, &len);
10575 p += len;
10576 printf (_("flag = %d, vendor = %s\n"), val, p);
10577 p += strlen ((char *) p) + 1;
10578 return p;
10579 }
10580
10581 if ((tag & 2) == 0 && display_proc_gnu_attribute)
10582 return display_proc_gnu_attribute (p, tag);
10583
10584 if (tag & 1)
10585 type = 1; /* String. */
10586 else
10587 type = 2; /* uleb128. */
10588 printf (" Tag_unknown_%d: ", tag);
10589
10590 if (type == 1)
10591 {
10592 printf ("\"%s\"\n", p);
10593 p += strlen ((char *) p) + 1;
10594 }
10595 else
10596 {
10597 val = read_uleb128 (p, &len);
10598 p += len;
10599 printf ("%d (0x%x)\n", val, val);
10600 }
10601
10602 return p;
10603 }
10604
10605 static unsigned char *
10606 display_power_gnu_attribute (unsigned char * p, int tag)
10607 {
10608 int type;
10609 unsigned int len;
10610 int val;
10611
10612 if (tag == Tag_GNU_Power_ABI_FP)
10613 {
10614 val = read_uleb128 (p, &len);
10615 p += len;
10616 printf (" Tag_GNU_Power_ABI_FP: ");
10617
10618 switch (val)
10619 {
10620 case 0:
10621 printf (_("Hard or soft float\n"));
10622 break;
10623 case 1:
10624 printf (_("Hard float\n"));
10625 break;
10626 case 2:
10627 printf (_("Soft float\n"));
10628 break;
10629 case 3:
10630 printf (_("Single-precision hard float\n"));
10631 break;
10632 default:
10633 printf ("??? (%d)\n", val);
10634 break;
10635 }
10636 return p;
10637 }
10638
10639 if (tag == Tag_GNU_Power_ABI_Vector)
10640 {
10641 val = read_uleb128 (p, &len);
10642 p += len;
10643 printf (" Tag_GNU_Power_ABI_Vector: ");
10644 switch (val)
10645 {
10646 case 0:
10647 printf (_("Any\n"));
10648 break;
10649 case 1:
10650 printf (_("Generic\n"));
10651 break;
10652 case 2:
10653 printf ("AltiVec\n");
10654 break;
10655 case 3:
10656 printf ("SPE\n");
10657 break;
10658 default:
10659 printf ("??? (%d)\n", val);
10660 break;
10661 }
10662 return p;
10663 }
10664
10665 if (tag == Tag_GNU_Power_ABI_Struct_Return)
10666 {
10667 val = read_uleb128 (p, &len);
10668 p += len;
10669 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
10670 switch (val)
10671 {
10672 case 0:
10673 printf (_("Any\n"));
10674 break;
10675 case 1:
10676 printf ("r3/r4\n");
10677 break;
10678 case 2:
10679 printf (_("Memory\n"));
10680 break;
10681 default:
10682 printf ("??? (%d)\n", val);
10683 break;
10684 }
10685 return p;
10686 }
10687
10688 if (tag & 1)
10689 type = 1; /* String. */
10690 else
10691 type = 2; /* uleb128. */
10692 printf (" Tag_unknown_%d: ", tag);
10693
10694 if (type == 1)
10695 {
10696 printf ("\"%s\"\n", p);
10697 p += strlen ((char *) p) + 1;
10698 }
10699 else
10700 {
10701 val = read_uleb128 (p, &len);
10702 p += len;
10703 printf ("%d (0x%x)\n", val, val);
10704 }
10705
10706 return p;
10707 }
10708
10709 static unsigned char *
10710 display_mips_gnu_attribute (unsigned char * p, int tag)
10711 {
10712 int type;
10713 unsigned int len;
10714 int val;
10715
10716 if (tag == Tag_GNU_MIPS_ABI_FP)
10717 {
10718 val = read_uleb128 (p, &len);
10719 p += len;
10720 printf (" Tag_GNU_MIPS_ABI_FP: ");
10721
10722 switch (val)
10723 {
10724 case 0:
10725 printf (_("Hard or soft float\n"));
10726 break;
10727 case 1:
10728 printf (_("Hard float (double precision)\n"));
10729 break;
10730 case 2:
10731 printf (_("Hard float (single precision)\n"));
10732 break;
10733 case 3:
10734 printf (_("Soft float\n"));
10735 break;
10736 case 4:
10737 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
10738 break;
10739 default:
10740 printf ("??? (%d)\n", val);
10741 break;
10742 }
10743 return p;
10744 }
10745
10746 if (tag & 1)
10747 type = 1; /* String. */
10748 else
10749 type = 2; /* uleb128. */
10750 printf (" Tag_unknown_%d: ", tag);
10751
10752 if (type == 1)
10753 {
10754 printf ("\"%s\"\n", p);
10755 p += strlen ((char *) p) + 1;
10756 }
10757 else
10758 {
10759 val = read_uleb128 (p, &len);
10760 p += len;
10761 printf ("%d (0x%x)\n", val, val);
10762 }
10763
10764 return p;
10765 }
10766
10767 static unsigned char *
10768 display_tic6x_attribute (unsigned char * p)
10769 {
10770 int tag;
10771 unsigned int len;
10772 int val;
10773
10774 tag = read_uleb128 (p, &len);
10775 p += len;
10776
10777 switch (tag)
10778 {
10779 case Tag_ISA:
10780 val = read_uleb128 (p, &len);
10781 p += len;
10782 printf (" Tag_ISA: ");
10783
10784 switch (val)
10785 {
10786 case C6XABI_Tag_ISA_none:
10787 printf (_("None\n"));
10788 break;
10789 case C6XABI_Tag_ISA_C62X:
10790 printf ("C62x\n");
10791 break;
10792 case C6XABI_Tag_ISA_C67X:
10793 printf ("C67x\n");
10794 break;
10795 case C6XABI_Tag_ISA_C67XP:
10796 printf ("C67x+\n");
10797 break;
10798 case C6XABI_Tag_ISA_C64X:
10799 printf ("C64x\n");
10800 break;
10801 case C6XABI_Tag_ISA_C64XP:
10802 printf ("C64x+\n");
10803 break;
10804 case C6XABI_Tag_ISA_C674X:
10805 printf ("C674x\n");
10806 break;
10807 default:
10808 printf ("??? (%d)\n", val);
10809 break;
10810 }
10811 return p;
10812
10813 case Tag_ABI_DSBT:
10814 val = read_uleb128 (p, &len);
10815 p += len;
10816 printf (" Tag_ABI_DSBT: ");
10817 switch (val)
10818 {
10819 case 0:
10820 printf (_("DSBT addressing not used\n"));
10821 break;
10822 case 1:
10823 printf (_("DSBT addressing used\n"));
10824 break;
10825 default:
10826 printf ("??? (%d)\n", val);
10827 break;
10828 }
10829 return p;
10830
10831 case 32:
10832 /* Tag_compatibility - treated as generic by binutils for now
10833 although not currently specified for C6X. */
10834 val = read_uleb128 (p, &len);
10835 p += len;
10836 printf (_("flag = %d, vendor = %s\n"), val, p);
10837 p += strlen ((char *) p) + 1;
10838 return p;
10839 }
10840
10841 printf (" Tag_unknown_%d: ", tag);
10842
10843 /* No general documentation of handling unknown attributes, treat as
10844 ULEB128 for now. */
10845 val = read_uleb128 (p, &len);
10846 p += len;
10847 printf ("%d (0x%x)\n", val, val);
10848
10849 return p;
10850 }
10851
10852 static int
10853 process_attributes (FILE * file,
10854 const char * public_name,
10855 unsigned int proc_type,
10856 unsigned char * (* display_pub_attribute) (unsigned char *),
10857 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10858 {
10859 Elf_Internal_Shdr * sect;
10860 unsigned char * contents;
10861 unsigned char * p;
10862 unsigned char * end;
10863 bfd_vma section_len;
10864 bfd_vma len;
10865 unsigned i;
10866
10867 /* Find the section header so that we get the size. */
10868 for (i = 0, sect = section_headers;
10869 i < elf_header.e_shnum;
10870 i++, sect++)
10871 {
10872 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
10873 continue;
10874
10875 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
10876 sect->sh_size, _("attributes"));
10877 if (contents == NULL)
10878 continue;
10879
10880 p = contents;
10881 if (*p == 'A')
10882 {
10883 len = sect->sh_size - 1;
10884 p++;
10885
10886 while (len > 0)
10887 {
10888 int namelen;
10889 bfd_boolean public_section;
10890 bfd_boolean gnu_section;
10891
10892 section_len = byte_get (p, 4);
10893 p += 4;
10894
10895 if (section_len > len)
10896 {
10897 printf (_("ERROR: Bad section length (%d > %d)\n"),
10898 (int) section_len, (int) len);
10899 section_len = len;
10900 }
10901
10902 len -= section_len;
10903 printf (_("Attribute Section: %s\n"), p);
10904
10905 if (public_name && streq ((char *) p, public_name))
10906 public_section = TRUE;
10907 else
10908 public_section = FALSE;
10909
10910 if (streq ((char *) p, "gnu"))
10911 gnu_section = TRUE;
10912 else
10913 gnu_section = FALSE;
10914
10915 namelen = strlen ((char *) p) + 1;
10916 p += namelen;
10917 section_len -= namelen + 4;
10918
10919 while (section_len > 0)
10920 {
10921 int tag = *(p++);
10922 int val;
10923 bfd_vma size;
10924
10925 size = byte_get (p, 4);
10926 if (size > section_len)
10927 {
10928 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
10929 (int) size, (int) section_len);
10930 size = section_len;
10931 }
10932
10933 section_len -= size;
10934 end = p + size - 1;
10935 p += 4;
10936
10937 switch (tag)
10938 {
10939 case 1:
10940 printf (_("File Attributes\n"));
10941 break;
10942 case 2:
10943 printf (_("Section Attributes:"));
10944 goto do_numlist;
10945 case 3:
10946 printf (_("Symbol Attributes:"));
10947 do_numlist:
10948 for (;;)
10949 {
10950 unsigned int j;
10951
10952 val = read_uleb128 (p, &j);
10953 p += j;
10954 if (val == 0)
10955 break;
10956 printf (" %d", val);
10957 }
10958 printf ("\n");
10959 break;
10960 default:
10961 printf (_("Unknown tag: %d\n"), tag);
10962 public_section = FALSE;
10963 break;
10964 }
10965
10966 if (public_section)
10967 {
10968 while (p < end)
10969 p = display_pub_attribute (p);
10970 }
10971 else if (gnu_section)
10972 {
10973 while (p < end)
10974 p = display_gnu_attribute (p,
10975 display_proc_gnu_attribute);
10976 }
10977 else
10978 {
10979 /* ??? Do something sensible, like dump hex. */
10980 printf (_(" Unknown section contexts\n"));
10981 p = end;
10982 }
10983 }
10984 }
10985 }
10986 else
10987 printf (_("Unknown format '%c'\n"), *p);
10988
10989 free (contents);
10990 }
10991 return 1;
10992 }
10993
10994 static int
10995 process_arm_specific (FILE * file)
10996 {
10997 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
10998 display_arm_attribute, NULL);
10999 }
11000
11001 static int
11002 process_power_specific (FILE * file)
11003 {
11004 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11005 display_power_gnu_attribute);
11006 }
11007
11008 static int
11009 process_tic6x_specific (FILE * file)
11010 {
11011 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11012 display_tic6x_attribute, NULL);
11013 }
11014
11015 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11016 Print the Address, Access and Initial fields of an entry at VMA ADDR
11017 and return the VMA of the next entry. */
11018
11019 static bfd_vma
11020 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11021 {
11022 printf (" ");
11023 print_vma (addr, LONG_HEX);
11024 printf (" ");
11025 if (addr < pltgot + 0xfff0)
11026 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11027 else
11028 printf ("%10s", "");
11029 printf (" ");
11030 if (data == NULL)
11031 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11032 else
11033 {
11034 bfd_vma entry;
11035
11036 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11037 print_vma (entry, LONG_HEX);
11038 }
11039 return addr + (is_32bit_elf ? 4 : 8);
11040 }
11041
11042 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11043 PLTGOT. Print the Address and Initial fields of an entry at VMA
11044 ADDR and return the VMA of the next entry. */
11045
11046 static bfd_vma
11047 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11048 {
11049 printf (" ");
11050 print_vma (addr, LONG_HEX);
11051 printf (" ");
11052 if (data == NULL)
11053 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11054 else
11055 {
11056 bfd_vma entry;
11057
11058 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11059 print_vma (entry, LONG_HEX);
11060 }
11061 return addr + (is_32bit_elf ? 4 : 8);
11062 }
11063
11064 static int
11065 process_mips_specific (FILE * file)
11066 {
11067 Elf_Internal_Dyn * entry;
11068 size_t liblist_offset = 0;
11069 size_t liblistno = 0;
11070 size_t conflictsno = 0;
11071 size_t options_offset = 0;
11072 size_t conflicts_offset = 0;
11073 size_t pltrelsz = 0;
11074 size_t pltrel = 0;
11075 bfd_vma pltgot = 0;
11076 bfd_vma mips_pltgot = 0;
11077 bfd_vma jmprel = 0;
11078 bfd_vma local_gotno = 0;
11079 bfd_vma gotsym = 0;
11080 bfd_vma symtabno = 0;
11081
11082 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11083 display_mips_gnu_attribute);
11084
11085 /* We have a lot of special sections. Thanks SGI! */
11086 if (dynamic_section == NULL)
11087 /* No information available. */
11088 return 0;
11089
11090 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11091 switch (entry->d_tag)
11092 {
11093 case DT_MIPS_LIBLIST:
11094 liblist_offset
11095 = offset_from_vma (file, entry->d_un.d_val,
11096 liblistno * sizeof (Elf32_External_Lib));
11097 break;
11098 case DT_MIPS_LIBLISTNO:
11099 liblistno = entry->d_un.d_val;
11100 break;
11101 case DT_MIPS_OPTIONS:
11102 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11103 break;
11104 case DT_MIPS_CONFLICT:
11105 conflicts_offset
11106 = offset_from_vma (file, entry->d_un.d_val,
11107 conflictsno * sizeof (Elf32_External_Conflict));
11108 break;
11109 case DT_MIPS_CONFLICTNO:
11110 conflictsno = entry->d_un.d_val;
11111 break;
11112 case DT_PLTGOT:
11113 pltgot = entry->d_un.d_ptr;
11114 break;
11115 case DT_MIPS_LOCAL_GOTNO:
11116 local_gotno = entry->d_un.d_val;
11117 break;
11118 case DT_MIPS_GOTSYM:
11119 gotsym = entry->d_un.d_val;
11120 break;
11121 case DT_MIPS_SYMTABNO:
11122 symtabno = entry->d_un.d_val;
11123 break;
11124 case DT_MIPS_PLTGOT:
11125 mips_pltgot = entry->d_un.d_ptr;
11126 break;
11127 case DT_PLTREL:
11128 pltrel = entry->d_un.d_val;
11129 break;
11130 case DT_PLTRELSZ:
11131 pltrelsz = entry->d_un.d_val;
11132 break;
11133 case DT_JMPREL:
11134 jmprel = entry->d_un.d_ptr;
11135 break;
11136 default:
11137 break;
11138 }
11139
11140 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11141 {
11142 Elf32_External_Lib * elib;
11143 size_t cnt;
11144
11145 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
11146 liblistno,
11147 sizeof (Elf32_External_Lib),
11148 _("liblist"));
11149 if (elib)
11150 {
11151 printf (_("\nSection '.liblist' contains %lu entries:\n"),
11152 (unsigned long) liblistno);
11153 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
11154 stdout);
11155
11156 for (cnt = 0; cnt < liblistno; ++cnt)
11157 {
11158 Elf32_Lib liblist;
11159 time_t atime;
11160 char timebuf[20];
11161 struct tm * tmp;
11162
11163 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11164 atime = BYTE_GET (elib[cnt].l_time_stamp);
11165 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11166 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11167 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11168
11169 tmp = gmtime (&atime);
11170 snprintf (timebuf, sizeof (timebuf),
11171 "%04u-%02u-%02uT%02u:%02u:%02u",
11172 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11173 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11174
11175 printf ("%3lu: ", (unsigned long) cnt);
11176 if (VALID_DYNAMIC_NAME (liblist.l_name))
11177 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11178 else
11179 printf (_("<corrupt: %9ld>"), liblist.l_name);
11180 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11181 liblist.l_version);
11182
11183 if (liblist.l_flags == 0)
11184 puts (_(" NONE"));
11185 else
11186 {
11187 static const struct
11188 {
11189 const char * name;
11190 int bit;
11191 }
11192 l_flags_vals[] =
11193 {
11194 { " EXACT_MATCH", LL_EXACT_MATCH },
11195 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11196 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11197 { " EXPORTS", LL_EXPORTS },
11198 { " DELAY_LOAD", LL_DELAY_LOAD },
11199 { " DELTA", LL_DELTA }
11200 };
11201 int flags = liblist.l_flags;
11202 size_t fcnt;
11203
11204 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
11205 if ((flags & l_flags_vals[fcnt].bit) != 0)
11206 {
11207 fputs (l_flags_vals[fcnt].name, stdout);
11208 flags ^= l_flags_vals[fcnt].bit;
11209 }
11210 if (flags != 0)
11211 printf (" %#x", (unsigned int) flags);
11212
11213 puts ("");
11214 }
11215 }
11216
11217 free (elib);
11218 }
11219 }
11220
11221 if (options_offset != 0)
11222 {
11223 Elf_External_Options * eopt;
11224 Elf_Internal_Shdr * sect = section_headers;
11225 Elf_Internal_Options * iopt;
11226 Elf_Internal_Options * option;
11227 size_t offset;
11228 int cnt;
11229
11230 /* Find the section header so that we get the size. */
11231 while (sect->sh_type != SHT_MIPS_OPTIONS)
11232 ++sect;
11233
11234 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
11235 sect->sh_size, _("options"));
11236 if (eopt)
11237 {
11238 iopt = (Elf_Internal_Options *)
11239 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
11240 if (iopt == NULL)
11241 {
11242 error (_("Out of memory\n"));
11243 return 0;
11244 }
11245
11246 offset = cnt = 0;
11247 option = iopt;
11248
11249 while (offset < sect->sh_size)
11250 {
11251 Elf_External_Options * eoption;
11252
11253 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11254
11255 option->kind = BYTE_GET (eoption->kind);
11256 option->size = BYTE_GET (eoption->size);
11257 option->section = BYTE_GET (eoption->section);
11258 option->info = BYTE_GET (eoption->info);
11259
11260 offset += option->size;
11261
11262 ++option;
11263 ++cnt;
11264 }
11265
11266 printf (_("\nSection '%s' contains %d entries:\n"),
11267 SECTION_NAME (sect), cnt);
11268
11269 option = iopt;
11270
11271 while (cnt-- > 0)
11272 {
11273 size_t len;
11274
11275 switch (option->kind)
11276 {
11277 case ODK_NULL:
11278 /* This shouldn't happen. */
11279 printf (" NULL %d %lx", option->section, option->info);
11280 break;
11281 case ODK_REGINFO:
11282 printf (" REGINFO ");
11283 if (elf_header.e_machine == EM_MIPS)
11284 {
11285 /* 32bit form. */
11286 Elf32_External_RegInfo * ereg;
11287 Elf32_RegInfo reginfo;
11288
11289 ereg = (Elf32_External_RegInfo *) (option + 1);
11290 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11291 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11292 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11293 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11294 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11295 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11296
11297 printf ("GPR %08lx GP 0x%lx\n",
11298 reginfo.ri_gprmask,
11299 (unsigned long) reginfo.ri_gp_value);
11300 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11301 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11302 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11303 }
11304 else
11305 {
11306 /* 64 bit form. */
11307 Elf64_External_RegInfo * ereg;
11308 Elf64_Internal_RegInfo reginfo;
11309
11310 ereg = (Elf64_External_RegInfo *) (option + 1);
11311 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11312 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11313 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11314 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11315 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11316 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11317
11318 printf ("GPR %08lx GP 0x",
11319 reginfo.ri_gprmask);
11320 printf_vma (reginfo.ri_gp_value);
11321 printf ("\n");
11322
11323 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11324 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11325 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11326 }
11327 ++option;
11328 continue;
11329 case ODK_EXCEPTIONS:
11330 fputs (" EXCEPTIONS fpe_min(", stdout);
11331 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11332 fputs (") fpe_max(", stdout);
11333 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11334 fputs (")", stdout);
11335
11336 if (option->info & OEX_PAGE0)
11337 fputs (" PAGE0", stdout);
11338 if (option->info & OEX_SMM)
11339 fputs (" SMM", stdout);
11340 if (option->info & OEX_FPDBUG)
11341 fputs (" FPDBUG", stdout);
11342 if (option->info & OEX_DISMISS)
11343 fputs (" DISMISS", stdout);
11344 break;
11345 case ODK_PAD:
11346 fputs (" PAD ", stdout);
11347 if (option->info & OPAD_PREFIX)
11348 fputs (" PREFIX", stdout);
11349 if (option->info & OPAD_POSTFIX)
11350 fputs (" POSTFIX", stdout);
11351 if (option->info & OPAD_SYMBOL)
11352 fputs (" SYMBOL", stdout);
11353 break;
11354 case ODK_HWPATCH:
11355 fputs (" HWPATCH ", stdout);
11356 if (option->info & OHW_R4KEOP)
11357 fputs (" R4KEOP", stdout);
11358 if (option->info & OHW_R8KPFETCH)
11359 fputs (" R8KPFETCH", stdout);
11360 if (option->info & OHW_R5KEOP)
11361 fputs (" R5KEOP", stdout);
11362 if (option->info & OHW_R5KCVTL)
11363 fputs (" R5KCVTL", stdout);
11364 break;
11365 case ODK_FILL:
11366 fputs (" FILL ", stdout);
11367 /* XXX Print content of info word? */
11368 break;
11369 case ODK_TAGS:
11370 fputs (" TAGS ", stdout);
11371 /* XXX Print content of info word? */
11372 break;
11373 case ODK_HWAND:
11374 fputs (" HWAND ", stdout);
11375 if (option->info & OHWA0_R4KEOP_CHECKED)
11376 fputs (" R4KEOP_CHECKED", stdout);
11377 if (option->info & OHWA0_R4KEOP_CLEAN)
11378 fputs (" R4KEOP_CLEAN", stdout);
11379 break;
11380 case ODK_HWOR:
11381 fputs (" HWOR ", stdout);
11382 if (option->info & OHWA0_R4KEOP_CHECKED)
11383 fputs (" R4KEOP_CHECKED", stdout);
11384 if (option->info & OHWA0_R4KEOP_CLEAN)
11385 fputs (" R4KEOP_CLEAN", stdout);
11386 break;
11387 case ODK_GP_GROUP:
11388 printf (" GP_GROUP %#06lx self-contained %#06lx",
11389 option->info & OGP_GROUP,
11390 (option->info & OGP_SELF) >> 16);
11391 break;
11392 case ODK_IDENT:
11393 printf (" IDENT %#06lx self-contained %#06lx",
11394 option->info & OGP_GROUP,
11395 (option->info & OGP_SELF) >> 16);
11396 break;
11397 default:
11398 /* This shouldn't happen. */
11399 printf (" %3d ??? %d %lx",
11400 option->kind, option->section, option->info);
11401 break;
11402 }
11403
11404 len = sizeof (* eopt);
11405 while (len < option->size)
11406 if (((char *) option)[len] >= ' '
11407 && ((char *) option)[len] < 0x7f)
11408 printf ("%c", ((char *) option)[len++]);
11409 else
11410 printf ("\\%03o", ((char *) option)[len++]);
11411
11412 fputs ("\n", stdout);
11413 ++option;
11414 }
11415
11416 free (eopt);
11417 }
11418 }
11419
11420 if (conflicts_offset != 0 && conflictsno != 0)
11421 {
11422 Elf32_Conflict * iconf;
11423 size_t cnt;
11424
11425 if (dynamic_symbols == NULL)
11426 {
11427 error (_("conflict list found without a dynamic symbol table\n"));
11428 return 0;
11429 }
11430
11431 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
11432 if (iconf == NULL)
11433 {
11434 error (_("Out of memory\n"));
11435 return 0;
11436 }
11437
11438 if (is_32bit_elf)
11439 {
11440 Elf32_External_Conflict * econf32;
11441
11442 econf32 = (Elf32_External_Conflict *)
11443 get_data (NULL, file, conflicts_offset, conflictsno,
11444 sizeof (* econf32), _("conflict"));
11445 if (!econf32)
11446 return 0;
11447
11448 for (cnt = 0; cnt < conflictsno; ++cnt)
11449 iconf[cnt] = BYTE_GET (econf32[cnt]);
11450
11451 free (econf32);
11452 }
11453 else
11454 {
11455 Elf64_External_Conflict * econf64;
11456
11457 econf64 = (Elf64_External_Conflict *)
11458 get_data (NULL, file, conflicts_offset, conflictsno,
11459 sizeof (* econf64), _("conflict"));
11460 if (!econf64)
11461 return 0;
11462
11463 for (cnt = 0; cnt < conflictsno; ++cnt)
11464 iconf[cnt] = BYTE_GET (econf64[cnt]);
11465
11466 free (econf64);
11467 }
11468
11469 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11470 (unsigned long) conflictsno);
11471 puts (_(" Num: Index Value Name"));
11472
11473 for (cnt = 0; cnt < conflictsno; ++cnt)
11474 {
11475 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
11476
11477 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
11478 print_vma (psym->st_value, FULL_HEX);
11479 putchar (' ');
11480 if (VALID_DYNAMIC_NAME (psym->st_name))
11481 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11482 else
11483 printf (_("<corrupt: %14ld>"), psym->st_name);
11484 putchar ('\n');
11485 }
11486
11487 free (iconf);
11488 }
11489
11490 if (pltgot != 0 && local_gotno != 0)
11491 {
11492 bfd_vma ent, local_end, global_end;
11493 size_t i, offset;
11494 unsigned char * data;
11495 int addr_size;
11496
11497 ent = pltgot;
11498 addr_size = (is_32bit_elf ? 4 : 8);
11499 local_end = pltgot + local_gotno * addr_size;
11500 global_end = local_end + (symtabno - gotsym) * addr_size;
11501
11502 offset = offset_from_vma (file, pltgot, global_end - pltgot);
11503 data = (unsigned char *) get_data (NULL, file, offset,
11504 global_end - pltgot, 1, _("GOT"));
11505 printf (_("\nPrimary GOT:\n"));
11506 printf (_(" Canonical gp value: "));
11507 print_vma (pltgot + 0x7ff0, LONG_HEX);
11508 printf ("\n\n");
11509
11510 printf (_(" Reserved entries:\n"));
11511 printf (_(" %*s %10s %*s Purpose\n"),
11512 addr_size * 2, _("Address"), _("Access"),
11513 addr_size * 2, _("Initial"));
11514 ent = print_mips_got_entry (data, pltgot, ent);
11515 printf (_(" Lazy resolver\n"));
11516 if (data
11517 && (byte_get (data + ent - pltgot, addr_size)
11518 >> (addr_size * 8 - 1)) != 0)
11519 {
11520 ent = print_mips_got_entry (data, pltgot, ent);
11521 printf (_(" Module pointer (GNU extension)\n"));
11522 }
11523 printf ("\n");
11524
11525 if (ent < local_end)
11526 {
11527 printf (_(" Local entries:\n"));
11528 printf (_(" %*s %10s %*s\n"),
11529 addr_size * 2, _("Address"), _("Access"),
11530 addr_size * 2, _("Initial"));
11531 while (ent < local_end)
11532 {
11533 ent = print_mips_got_entry (data, pltgot, ent);
11534 printf ("\n");
11535 }
11536 printf ("\n");
11537 }
11538
11539 if (gotsym < symtabno)
11540 {
11541 int sym_width;
11542
11543 printf (_(" Global entries:\n"));
11544 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
11545 addr_size * 2, _("Address"), _("Access"),
11546 addr_size * 2, _("Initial"),
11547 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
11548 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
11549 for (i = gotsym; i < symtabno; i++)
11550 {
11551 Elf_Internal_Sym * psym;
11552
11553 psym = dynamic_symbols + i;
11554 ent = print_mips_got_entry (data, pltgot, ent);
11555 printf (" ");
11556 print_vma (psym->st_value, LONG_HEX);
11557 printf (" %-7s %3s ",
11558 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
11559 get_symbol_index_type (psym->st_shndx));
11560 if (VALID_DYNAMIC_NAME (psym->st_name))
11561 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
11562 else
11563 printf (_("<corrupt: %14ld>"), psym->st_name);
11564 printf ("\n");
11565 }
11566 printf ("\n");
11567 }
11568
11569 if (data)
11570 free (data);
11571 }
11572
11573 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
11574 {
11575 bfd_vma ent, end;
11576 size_t offset, rel_offset;
11577 unsigned long count, i;
11578 unsigned char * data;
11579 int addr_size, sym_width;
11580 Elf_Internal_Rela * rels;
11581
11582 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
11583 if (pltrel == DT_RELA)
11584 {
11585 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
11586 return 0;
11587 }
11588 else
11589 {
11590 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
11591 return 0;
11592 }
11593
11594 ent = mips_pltgot;
11595 addr_size = (is_32bit_elf ? 4 : 8);
11596 end = mips_pltgot + (2 + count) * addr_size;
11597
11598 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
11599 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
11600 1, _("PLT GOT"));
11601 printf (_("\nPLT GOT:\n\n"));
11602 printf (_(" Reserved entries:\n"));
11603 printf (_(" %*s %*s Purpose\n"),
11604 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
11605 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11606 printf (_(" PLT lazy resolver\n"));
11607 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11608 printf (_(" Module pointer\n"));
11609 printf ("\n");
11610
11611 printf (_(" Entries:\n"));
11612 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
11613 addr_size * 2, _("Address"),
11614 addr_size * 2, _("Initial"),
11615 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
11616 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
11617 for (i = 0; i < count; i++)
11618 {
11619 Elf_Internal_Sym * psym;
11620
11621 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
11622 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11623 printf (" ");
11624 print_vma (psym->st_value, LONG_HEX);
11625 printf (" %-7s %3s ",
11626 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
11627 get_symbol_index_type (psym->st_shndx));
11628 if (VALID_DYNAMIC_NAME (psym->st_name))
11629 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
11630 else
11631 printf (_("<corrupt: %14ld>"), psym->st_name);
11632 printf ("\n");
11633 }
11634 printf ("\n");
11635
11636 if (data)
11637 free (data);
11638 free (rels);
11639 }
11640
11641 return 1;
11642 }
11643
11644 static int
11645 process_gnu_liblist (FILE * file)
11646 {
11647 Elf_Internal_Shdr * section;
11648 Elf_Internal_Shdr * string_sec;
11649 Elf32_External_Lib * elib;
11650 char * strtab;
11651 size_t strtab_size;
11652 size_t cnt;
11653 unsigned i;
11654
11655 if (! do_arch)
11656 return 0;
11657
11658 for (i = 0, section = section_headers;
11659 i < elf_header.e_shnum;
11660 i++, section++)
11661 {
11662 switch (section->sh_type)
11663 {
11664 case SHT_GNU_LIBLIST:
11665 if (section->sh_link >= elf_header.e_shnum)
11666 break;
11667
11668 elib = (Elf32_External_Lib *)
11669 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
11670 _("liblist"));
11671
11672 if (elib == NULL)
11673 break;
11674 string_sec = section_headers + section->sh_link;
11675
11676 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
11677 string_sec->sh_size,
11678 _("liblist string table"));
11679 strtab_size = string_sec->sh_size;
11680
11681 if (strtab == NULL
11682 || section->sh_entsize != sizeof (Elf32_External_Lib))
11683 {
11684 free (elib);
11685 break;
11686 }
11687
11688 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11689 SECTION_NAME (section),
11690 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
11691
11692 puts (_(" Library Time Stamp Checksum Version Flags"));
11693
11694 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
11695 ++cnt)
11696 {
11697 Elf32_Lib liblist;
11698 time_t atime;
11699 char timebuf[20];
11700 struct tm * tmp;
11701
11702 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11703 atime = BYTE_GET (elib[cnt].l_time_stamp);
11704 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11705 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11706 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11707
11708 tmp = gmtime (&atime);
11709 snprintf (timebuf, sizeof (timebuf),
11710 "%04u-%02u-%02uT%02u:%02u:%02u",
11711 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11712 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11713
11714 printf ("%3lu: ", (unsigned long) cnt);
11715 if (do_wide)
11716 printf ("%-20s", liblist.l_name < strtab_size
11717 ? strtab + liblist.l_name : _("<corrupt>"));
11718 else
11719 printf ("%-20.20s", liblist.l_name < strtab_size
11720 ? strtab + liblist.l_name : _("<corrupt>"));
11721 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
11722 liblist.l_version, liblist.l_flags);
11723 }
11724
11725 free (elib);
11726 }
11727 }
11728
11729 return 1;
11730 }
11731
11732 static const char *
11733 get_note_type (unsigned e_type)
11734 {
11735 static char buff[64];
11736
11737 if (elf_header.e_type == ET_CORE)
11738 switch (e_type)
11739 {
11740 case NT_AUXV:
11741 return _("NT_AUXV (auxiliary vector)");
11742 case NT_PRSTATUS:
11743 return _("NT_PRSTATUS (prstatus structure)");
11744 case NT_FPREGSET:
11745 return _("NT_FPREGSET (floating point registers)");
11746 case NT_PRPSINFO:
11747 return _("NT_PRPSINFO (prpsinfo structure)");
11748 case NT_TASKSTRUCT:
11749 return _("NT_TASKSTRUCT (task structure)");
11750 case NT_PRXFPREG:
11751 return _("NT_PRXFPREG (user_xfpregs structure)");
11752 case NT_PPC_VMX:
11753 return _("NT_PPC_VMX (ppc Altivec registers)");
11754 case NT_PPC_VSX:
11755 return _("NT_PPC_VSX (ppc VSX registers)");
11756 case NT_X86_XSTATE:
11757 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
11758 case NT_S390_HIGH_GPRS:
11759 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
11760 case NT_S390_TIMER:
11761 return _("NT_S390_TIMER (s390 timer register)");
11762 case NT_S390_TODCMP:
11763 return _("NT_S390_TODCMP (s390 TOD comparator register)");
11764 case NT_S390_TODPREG:
11765 return _("NT_S390_TODPREG (s390 TOD programmable register)");
11766 case NT_S390_CTRS:
11767 return _("NT_S390_CTRS (s390 control registers)");
11768 case NT_S390_PREFIX:
11769 return _("NT_S390_PREFIX (s390 prefix register)");
11770 case NT_PSTATUS:
11771 return _("NT_PSTATUS (pstatus structure)");
11772 case NT_FPREGS:
11773 return _("NT_FPREGS (floating point registers)");
11774 case NT_PSINFO:
11775 return _("NT_PSINFO (psinfo structure)");
11776 case NT_LWPSTATUS:
11777 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11778 case NT_LWPSINFO:
11779 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11780 case NT_WIN32PSTATUS:
11781 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11782 default:
11783 break;
11784 }
11785 else
11786 switch (e_type)
11787 {
11788 case NT_VERSION:
11789 return _("NT_VERSION (version)");
11790 case NT_ARCH:
11791 return _("NT_ARCH (architecture)");
11792 default:
11793 break;
11794 }
11795
11796 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11797 return buff;
11798 }
11799
11800 static const char *
11801 get_gnu_elf_note_type (unsigned e_type)
11802 {
11803 static char buff[64];
11804
11805 switch (e_type)
11806 {
11807 case NT_GNU_ABI_TAG:
11808 return _("NT_GNU_ABI_TAG (ABI version tag)");
11809 case NT_GNU_HWCAP:
11810 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
11811 case NT_GNU_BUILD_ID:
11812 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
11813 case NT_GNU_GOLD_VERSION:
11814 return _("NT_GNU_GOLD_VERSION (gold version)");
11815 default:
11816 break;
11817 }
11818
11819 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11820 return buff;
11821 }
11822
11823 static const char *
11824 get_netbsd_elfcore_note_type (unsigned e_type)
11825 {
11826 static char buff[64];
11827
11828 if (e_type == NT_NETBSDCORE_PROCINFO)
11829 {
11830 /* NetBSD core "procinfo" structure. */
11831 return _("NetBSD procinfo structure");
11832 }
11833
11834 /* As of Jan 2002 there are no other machine-independent notes
11835 defined for NetBSD core files. If the note type is less
11836 than the start of the machine-dependent note types, we don't
11837 understand it. */
11838
11839 if (e_type < NT_NETBSDCORE_FIRSTMACH)
11840 {
11841 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11842 return buff;
11843 }
11844
11845 switch (elf_header.e_machine)
11846 {
11847 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11848 and PT_GETFPREGS == mach+2. */
11849
11850 case EM_OLD_ALPHA:
11851 case EM_ALPHA:
11852 case EM_SPARC:
11853 case EM_SPARC32PLUS:
11854 case EM_SPARCV9:
11855 switch (e_type)
11856 {
11857 case NT_NETBSDCORE_FIRSTMACH + 0:
11858 return _("PT_GETREGS (reg structure)");
11859 case NT_NETBSDCORE_FIRSTMACH + 2:
11860 return _("PT_GETFPREGS (fpreg structure)");
11861 default:
11862 break;
11863 }
11864 break;
11865
11866 /* On all other arch's, PT_GETREGS == mach+1 and
11867 PT_GETFPREGS == mach+3. */
11868 default:
11869 switch (e_type)
11870 {
11871 case NT_NETBSDCORE_FIRSTMACH + 1:
11872 return _("PT_GETREGS (reg structure)");
11873 case NT_NETBSDCORE_FIRSTMACH + 3:
11874 return _("PT_GETFPREGS (fpreg structure)");
11875 default:
11876 break;
11877 }
11878 }
11879
11880 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
11881 e_type - NT_NETBSDCORE_FIRSTMACH);
11882 return buff;
11883 }
11884
11885 /* Note that by the ELF standard, the name field is already null byte
11886 terminated, and namesz includes the terminating null byte.
11887 I.E. the value of namesz for the name "FSF" is 4.
11888
11889 If the value of namesz is zero, there is no name present. */
11890 static int
11891 process_note (Elf_Internal_Note * pnote)
11892 {
11893 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
11894 const char * nt;
11895
11896 if (pnote->namesz == 0)
11897 /* If there is no note name, then use the default set of
11898 note type strings. */
11899 nt = get_note_type (pnote->type);
11900
11901 else if (const_strneq (pnote->namedata, "GNU"))
11902 /* GNU-specific object file notes. */
11903 nt = get_gnu_elf_note_type (pnote->type);
11904
11905 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
11906 /* NetBSD-specific core file notes. */
11907 nt = get_netbsd_elfcore_note_type (pnote->type);
11908
11909 else if (strneq (pnote->namedata, "SPU/", 4))
11910 {
11911 /* SPU-specific core file notes. */
11912 nt = pnote->namedata + 4;
11913 name = "SPU";
11914 }
11915
11916 else
11917 /* Don't recognize this note name; just use the default set of
11918 note type strings. */
11919 nt = get_note_type (pnote->type);
11920
11921 printf (" %s\t\t0x%08lx\t%s\n", name, pnote->descsz, nt);
11922 return 1;
11923 }
11924
11925
11926 static int
11927 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
11928 {
11929 Elf_External_Note * pnotes;
11930 Elf_External_Note * external;
11931 int res = 1;
11932
11933 if (length <= 0)
11934 return 0;
11935
11936 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
11937 _("notes"));
11938 if (pnotes == NULL)
11939 return 0;
11940
11941 external = pnotes;
11942
11943 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11944 (unsigned long) offset, (unsigned long) length);
11945 printf (_(" Owner\t\tData size\tDescription\n"));
11946
11947 while (external < (Elf_External_Note *) ((char *) pnotes + length))
11948 {
11949 Elf_External_Note * next;
11950 Elf_Internal_Note inote;
11951 char * temp = NULL;
11952
11953 inote.type = BYTE_GET (external->type);
11954 inote.namesz = BYTE_GET (external->namesz);
11955 inote.namedata = external->name;
11956 inote.descsz = BYTE_GET (external->descsz);
11957 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
11958 inote.descpos = offset + (inote.descdata - (char *) pnotes);
11959
11960 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
11961
11962 if ( ((char *) next > ((char *) pnotes) + length)
11963 || ((char *) next < (char *) pnotes))
11964 {
11965 warn (_("corrupt note found at offset %lx into core notes\n"),
11966 (unsigned long) ((char *) external - (char *) pnotes));
11967 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
11968 inote.type, inote.namesz, inote.descsz);
11969 break;
11970 }
11971
11972 external = next;
11973
11974 /* Prevent out-of-bounds indexing. */
11975 if (inote.namedata + inote.namesz >= (char *) pnotes + length
11976 || inote.namedata + inote.namesz < inote.namedata)
11977 {
11978 warn (_("corrupt note found at offset %lx into core notes\n"),
11979 (unsigned long) ((char *) external - (char *) pnotes));
11980 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
11981 inote.type, inote.namesz, inote.descsz);
11982 break;
11983 }
11984
11985 /* Verify that name is null terminated. It appears that at least
11986 one version of Linux (RedHat 6.0) generates corefiles that don't
11987 comply with the ELF spec by failing to include the null byte in
11988 namesz. */
11989 if (inote.namedata[inote.namesz] != '\0')
11990 {
11991 temp = (char *) malloc (inote.namesz + 1);
11992
11993 if (temp == NULL)
11994 {
11995 error (_("Out of memory\n"));
11996 res = 0;
11997 break;
11998 }
11999
12000 strncpy (temp, inote.namedata, inote.namesz);
12001 temp[inote.namesz] = 0;
12002
12003 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
12004 inote.namedata = temp;
12005 }
12006
12007 res &= process_note (& inote);
12008
12009 if (temp != NULL)
12010 {
12011 free (temp);
12012 temp = NULL;
12013 }
12014 }
12015
12016 free (pnotes);
12017
12018 return res;
12019 }
12020
12021 static int
12022 process_corefile_note_segments (FILE * file)
12023 {
12024 Elf_Internal_Phdr * segment;
12025 unsigned int i;
12026 int res = 1;
12027
12028 if (! get_program_headers (file))
12029 return 0;
12030
12031 for (i = 0, segment = program_headers;
12032 i < elf_header.e_phnum;
12033 i++, segment++)
12034 {
12035 if (segment->p_type == PT_NOTE)
12036 res &= process_corefile_note_segment (file,
12037 (bfd_vma) segment->p_offset,
12038 (bfd_vma) segment->p_filesz);
12039 }
12040
12041 return res;
12042 }
12043
12044 static int
12045 process_note_sections (FILE * file)
12046 {
12047 Elf_Internal_Shdr * section;
12048 unsigned long i;
12049 int res = 1;
12050
12051 for (i = 0, section = section_headers;
12052 i < elf_header.e_shnum;
12053 i++, section++)
12054 if (section->sh_type == SHT_NOTE)
12055 res &= process_corefile_note_segment (file,
12056 (bfd_vma) section->sh_offset,
12057 (bfd_vma) section->sh_size);
12058
12059 return res;
12060 }
12061
12062 static int
12063 process_notes (FILE * file)
12064 {
12065 /* If we have not been asked to display the notes then do nothing. */
12066 if (! do_notes)
12067 return 1;
12068
12069 if (elf_header.e_type != ET_CORE)
12070 return process_note_sections (file);
12071
12072 /* No program headers means no NOTE segment. */
12073 if (elf_header.e_phnum > 0)
12074 return process_corefile_note_segments (file);
12075
12076 printf (_("No note segments present in the core file.\n"));
12077 return 1;
12078 }
12079
12080 static int
12081 process_arch_specific (FILE * file)
12082 {
12083 if (! do_arch)
12084 return 1;
12085
12086 switch (elf_header.e_machine)
12087 {
12088 case EM_ARM:
12089 return process_arm_specific (file);
12090 case EM_MIPS:
12091 case EM_MIPS_RS3_LE:
12092 return process_mips_specific (file);
12093 break;
12094 case EM_PPC:
12095 return process_power_specific (file);
12096 break;
12097 case EM_TI_C6000:
12098 return process_tic6x_specific (file);
12099 break;
12100 default:
12101 break;
12102 }
12103 return 1;
12104 }
12105
12106 static int
12107 get_file_header (FILE * file)
12108 {
12109 /* Read in the identity array. */
12110 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
12111 return 0;
12112
12113 /* Determine how to read the rest of the header. */
12114 switch (elf_header.e_ident[EI_DATA])
12115 {
12116 default: /* fall through */
12117 case ELFDATANONE: /* fall through */
12118 case ELFDATA2LSB:
12119 byte_get = byte_get_little_endian;
12120 byte_put = byte_put_little_endian;
12121 break;
12122 case ELFDATA2MSB:
12123 byte_get = byte_get_big_endian;
12124 byte_put = byte_put_big_endian;
12125 break;
12126 }
12127
12128 /* For now we only support 32 bit and 64 bit ELF files. */
12129 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
12130
12131 /* Read in the rest of the header. */
12132 if (is_32bit_elf)
12133 {
12134 Elf32_External_Ehdr ehdr32;
12135
12136 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
12137 return 0;
12138
12139 elf_header.e_type = BYTE_GET (ehdr32.e_type);
12140 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
12141 elf_header.e_version = BYTE_GET (ehdr32.e_version);
12142 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
12143 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
12144 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
12145 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
12146 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
12147 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
12148 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
12149 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
12150 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
12151 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
12152 }
12153 else
12154 {
12155 Elf64_External_Ehdr ehdr64;
12156
12157 /* If we have been compiled with sizeof (bfd_vma) == 4, then
12158 we will not be able to cope with the 64bit data found in
12159 64 ELF files. Detect this now and abort before we start
12160 overwriting things. */
12161 if (sizeof (bfd_vma) < 8)
12162 {
12163 error (_("This instance of readelf has been built without support for a\n\
12164 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12165 return 0;
12166 }
12167
12168 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
12169 return 0;
12170
12171 elf_header.e_type = BYTE_GET (ehdr64.e_type);
12172 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
12173 elf_header.e_version = BYTE_GET (ehdr64.e_version);
12174 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
12175 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
12176 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
12177 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
12178 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
12179 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
12180 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
12181 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
12182 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
12183 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
12184 }
12185
12186 if (elf_header.e_shoff)
12187 {
12188 /* There may be some extensions in the first section header. Don't
12189 bomb if we can't read it. */
12190 if (is_32bit_elf)
12191 get_32bit_section_headers (file, 1);
12192 else
12193 get_64bit_section_headers (file, 1);
12194 }
12195
12196 return 1;
12197 }
12198
12199 /* Process one ELF object file according to the command line options.
12200 This file may actually be stored in an archive. The file is
12201 positioned at the start of the ELF object. */
12202
12203 static int
12204 process_object (char * file_name, FILE * file)
12205 {
12206 unsigned int i;
12207
12208 if (! get_file_header (file))
12209 {
12210 error (_("%s: Failed to read file header\n"), file_name);
12211 return 1;
12212 }
12213
12214 /* Initialise per file variables. */
12215 for (i = ARRAY_SIZE (version_info); i--;)
12216 version_info[i] = 0;
12217
12218 for (i = ARRAY_SIZE (dynamic_info); i--;)
12219 dynamic_info[i] = 0;
12220
12221 /* Process the file. */
12222 if (show_name)
12223 printf (_("\nFile: %s\n"), file_name);
12224
12225 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12226 Note we do this even if cmdline_dump_sects is empty because we
12227 must make sure that the dump_sets array is zeroed out before each
12228 object file is processed. */
12229 if (num_dump_sects > num_cmdline_dump_sects)
12230 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
12231
12232 if (num_cmdline_dump_sects > 0)
12233 {
12234 if (num_dump_sects == 0)
12235 /* A sneaky way of allocating the dump_sects array. */
12236 request_dump_bynumber (num_cmdline_dump_sects, 0);
12237
12238 assert (num_dump_sects >= num_cmdline_dump_sects);
12239 memcpy (dump_sects, cmdline_dump_sects,
12240 num_cmdline_dump_sects * sizeof (* dump_sects));
12241 }
12242
12243 if (! process_file_header ())
12244 return 1;
12245
12246 if (! process_section_headers (file))
12247 {
12248 /* Without loaded section headers we cannot process lots of
12249 things. */
12250 do_unwind = do_version = do_dump = do_arch = 0;
12251
12252 if (! do_using_dynamic)
12253 do_syms = do_dyn_syms = do_reloc = 0;
12254 }
12255
12256 if (! process_section_groups (file))
12257 {
12258 /* Without loaded section groups we cannot process unwind. */
12259 do_unwind = 0;
12260 }
12261
12262 if (process_program_headers (file))
12263 process_dynamic_section (file);
12264
12265 process_relocs (file);
12266
12267 process_unwind (file);
12268
12269 process_symbol_table (file);
12270
12271 process_syminfo (file);
12272
12273 process_version_sections (file);
12274
12275 process_section_contents (file);
12276
12277 process_notes (file);
12278
12279 process_gnu_liblist (file);
12280
12281 process_arch_specific (file);
12282
12283 if (program_headers)
12284 {
12285 free (program_headers);
12286 program_headers = NULL;
12287 }
12288
12289 if (section_headers)
12290 {
12291 free (section_headers);
12292 section_headers = NULL;
12293 }
12294
12295 if (string_table)
12296 {
12297 free (string_table);
12298 string_table = NULL;
12299 string_table_length = 0;
12300 }
12301
12302 if (dynamic_strings)
12303 {
12304 free (dynamic_strings);
12305 dynamic_strings = NULL;
12306 dynamic_strings_length = 0;
12307 }
12308
12309 if (dynamic_symbols)
12310 {
12311 free (dynamic_symbols);
12312 dynamic_symbols = NULL;
12313 num_dynamic_syms = 0;
12314 }
12315
12316 if (dynamic_syminfo)
12317 {
12318 free (dynamic_syminfo);
12319 dynamic_syminfo = NULL;
12320 }
12321
12322 if (section_headers_groups)
12323 {
12324 free (section_headers_groups);
12325 section_headers_groups = NULL;
12326 }
12327
12328 if (section_groups)
12329 {
12330 struct group_list * g;
12331 struct group_list * next;
12332
12333 for (i = 0; i < group_count; i++)
12334 {
12335 for (g = section_groups [i].root; g != NULL; g = next)
12336 {
12337 next = g->next;
12338 free (g);
12339 }
12340 }
12341
12342 free (section_groups);
12343 section_groups = NULL;
12344 }
12345
12346 free_debug_memory ();
12347
12348 return 0;
12349 }
12350
12351 /* Return the path name for a proxy entry in a thin archive, adjusted relative
12352 to the path name of the thin archive itself if necessary. Always returns
12353 a pointer to malloc'ed memory. */
12354
12355 static char *
12356 adjust_relative_path (char * file_name, char * name, int name_len)
12357 {
12358 char * member_file_name;
12359 const char * base_name = lbasename (file_name);
12360
12361 /* This is a proxy entry for a thin archive member.
12362 If the extended name table contains an absolute path
12363 name, or if the archive is in the current directory,
12364 use the path name as given. Otherwise, we need to
12365 find the member relative to the directory where the
12366 archive is located. */
12367 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
12368 {
12369 member_file_name = (char *) malloc (name_len + 1);
12370 if (member_file_name == NULL)
12371 {
12372 error (_("Out of memory\n"));
12373 return NULL;
12374 }
12375 memcpy (member_file_name, name, name_len);
12376 member_file_name[name_len] = '\0';
12377 }
12378 else
12379 {
12380 /* Concatenate the path components of the archive file name
12381 to the relative path name from the extended name table. */
12382 size_t prefix_len = base_name - file_name;
12383 member_file_name = (char *) malloc (prefix_len + name_len + 1);
12384 if (member_file_name == NULL)
12385 {
12386 error (_("Out of memory\n"));
12387 return NULL;
12388 }
12389 memcpy (member_file_name, file_name, prefix_len);
12390 memcpy (member_file_name + prefix_len, name, name_len);
12391 member_file_name[prefix_len + name_len] = '\0';
12392 }
12393 return member_file_name;
12394 }
12395
12396 /* Structure to hold information about an archive file. */
12397
12398 struct archive_info
12399 {
12400 char * file_name; /* Archive file name. */
12401 FILE * file; /* Open file descriptor. */
12402 unsigned long index_num; /* Number of symbols in table. */
12403 unsigned long * index_array; /* The array of member offsets. */
12404 char * sym_table; /* The symbol table. */
12405 unsigned long sym_size; /* Size of the symbol table. */
12406 char * longnames; /* The long file names table. */
12407 unsigned long longnames_size; /* Size of the long file names table. */
12408 unsigned long nested_member_origin; /* Origin in the nested archive of the current member. */
12409 unsigned long next_arhdr_offset; /* Offset of the next archive header. */
12410 bfd_boolean is_thin_archive; /* TRUE if this is a thin archive. */
12411 struct ar_hdr arhdr; /* Current archive header. */
12412 };
12413
12414 /* Read the symbol table and long-name table from an archive. */
12415
12416 static int
12417 setup_archive (struct archive_info * arch, char * file_name, FILE * file,
12418 bfd_boolean is_thin_archive, bfd_boolean read_symbols)
12419 {
12420 size_t got;
12421 unsigned long size;
12422
12423 arch->file_name = strdup (file_name);
12424 arch->file = file;
12425 arch->index_num = 0;
12426 arch->index_array = NULL;
12427 arch->sym_table = NULL;
12428 arch->sym_size = 0;
12429 arch->longnames = NULL;
12430 arch->longnames_size = 0;
12431 arch->nested_member_origin = 0;
12432 arch->is_thin_archive = is_thin_archive;
12433 arch->next_arhdr_offset = SARMAG;
12434
12435 /* Read the first archive member header. */
12436 if (fseek (file, SARMAG, SEEK_SET) != 0)
12437 {
12438 error (_("%s: failed to seek to first archive header\n"), file_name);
12439 return 1;
12440 }
12441 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
12442 if (got != sizeof arch->arhdr)
12443 {
12444 if (got == 0)
12445 return 0;
12446
12447 error (_("%s: failed to read archive header\n"), file_name);
12448 return 1;
12449 }
12450
12451 /* See if this is the archive symbol table. */
12452 if (const_strneq (arch->arhdr.ar_name, "/ ")
12453 || const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
12454 {
12455 size = strtoul (arch->arhdr.ar_size, NULL, 10);
12456 size = size + (size & 1);
12457
12458 arch->next_arhdr_offset += sizeof arch->arhdr + size;
12459
12460 if (read_symbols)
12461 {
12462 unsigned long i;
12463 /* A buffer used to hold numbers read in from an archive index.
12464 These are always 4 bytes long and stored in big-endian format. */
12465 #define SIZEOF_AR_INDEX_NUMBERS 4
12466 unsigned char integer_buffer[SIZEOF_AR_INDEX_NUMBERS];
12467 unsigned char * index_buffer;
12468
12469 /* Check the size of the archive index. */
12470 if (size < SIZEOF_AR_INDEX_NUMBERS)
12471 {
12472 error (_("%s: the archive index is empty\n"), file_name);
12473 return 1;
12474 }
12475
12476 /* Read the numer of entries in the archive index. */
12477 got = fread (integer_buffer, 1, sizeof integer_buffer, file);
12478 if (got != sizeof (integer_buffer))
12479 {
12480 error (_("%s: failed to read archive index\n"), file_name);
12481 return 1;
12482 }
12483 arch->index_num = byte_get_big_endian (integer_buffer, sizeof integer_buffer);
12484 size -= SIZEOF_AR_INDEX_NUMBERS;
12485
12486 /* Read in the archive index. */
12487 if (size < arch->index_num * SIZEOF_AR_INDEX_NUMBERS)
12488 {
12489 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
12490 file_name, arch->index_num);
12491 return 1;
12492 }
12493 index_buffer = (unsigned char *)
12494 malloc (arch->index_num * SIZEOF_AR_INDEX_NUMBERS);
12495 if (index_buffer == NULL)
12496 {
12497 error (_("Out of memory whilst trying to read archive symbol index\n"));
12498 return 1;
12499 }
12500 got = fread (index_buffer, SIZEOF_AR_INDEX_NUMBERS, arch->index_num, file);
12501 if (got != arch->index_num)
12502 {
12503 free (index_buffer);
12504 error (_("%s: failed to read archive index\n"), file_name);
12505 return 1;
12506 }
12507 size -= arch->index_num * SIZEOF_AR_INDEX_NUMBERS;
12508
12509 /* Convert the index numbers into the host's numeric format. */
12510 arch->index_array = (long unsigned int *)
12511 malloc (arch->index_num * sizeof (* arch->index_array));
12512 if (arch->index_array == NULL)
12513 {
12514 free (index_buffer);
12515 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
12516 return 1;
12517 }
12518
12519 for (i = 0; i < arch->index_num; i++)
12520 arch->index_array[i] = byte_get_big_endian ((unsigned char *) (index_buffer + (i * SIZEOF_AR_INDEX_NUMBERS)),
12521 SIZEOF_AR_INDEX_NUMBERS);
12522 free (index_buffer);
12523
12524 /* The remaining space in the header is taken up by the symbol table. */
12525 if (size < 1)
12526 {
12527 error (_("%s: the archive has an index but no symbols\n"), file_name);
12528 return 1;
12529 }
12530 arch->sym_table = (char *) malloc (size);
12531 arch->sym_size = size;
12532 if (arch->sym_table == NULL)
12533 {
12534 error (_("Out of memory whilst trying to read archive index symbol table\n"));
12535 return 1;
12536 }
12537 got = fread (arch->sym_table, 1, size, file);
12538 if (got != size)
12539 {
12540 error (_("%s: failed to read archive index symbol table\n"), file_name);
12541 return 1;
12542 }
12543 }
12544 else
12545 {
12546 if (fseek (file, size, SEEK_CUR) != 0)
12547 {
12548 error (_("%s: failed to skip archive symbol table\n"), file_name);
12549 return 1;
12550 }
12551 }
12552
12553 /* Read the next archive header. */
12554 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
12555 if (got != sizeof arch->arhdr)
12556 {
12557 if (got == 0)
12558 return 0;
12559 error (_("%s: failed to read archive header following archive index\n"), file_name);
12560 return 1;
12561 }
12562 }
12563 else if (read_symbols)
12564 printf (_("%s has no archive index\n"), file_name);
12565
12566 if (const_strneq (arch->arhdr.ar_name, "// "))
12567 {
12568 /* This is the archive string table holding long member names. */
12569 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
12570 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
12571
12572 arch->longnames = (char *) malloc (arch->longnames_size);
12573 if (arch->longnames == NULL)
12574 {
12575 error (_("Out of memory reading long symbol names in archive\n"));
12576 return 1;
12577 }
12578
12579 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
12580 {
12581 free (arch->longnames);
12582 arch->longnames = NULL;
12583 error (_("%s: failed to read long symbol name string table\n"), file_name);
12584 return 1;
12585 }
12586
12587 if ((arch->longnames_size & 1) != 0)
12588 getc (file);
12589 }
12590
12591 return 0;
12592 }
12593
12594 /* Release the memory used for the archive information. */
12595
12596 static void
12597 release_archive (struct archive_info * arch)
12598 {
12599 if (arch->file_name != NULL)
12600 free (arch->file_name);
12601 if (arch->index_array != NULL)
12602 free (arch->index_array);
12603 if (arch->sym_table != NULL)
12604 free (arch->sym_table);
12605 if (arch->longnames != NULL)
12606 free (arch->longnames);
12607 }
12608
12609 /* Open and setup a nested archive, if not already open. */
12610
12611 static int
12612 setup_nested_archive (struct archive_info * nested_arch, char * member_file_name)
12613 {
12614 FILE * member_file;
12615
12616 /* Have we already setup this archive? */
12617 if (nested_arch->file_name != NULL
12618 && streq (nested_arch->file_name, member_file_name))
12619 return 0;
12620
12621 /* Close previous file and discard cached information. */
12622 if (nested_arch->file != NULL)
12623 fclose (nested_arch->file);
12624 release_archive (nested_arch);
12625
12626 member_file = fopen (member_file_name, "rb");
12627 if (member_file == NULL)
12628 return 1;
12629 return setup_archive (nested_arch, member_file_name, member_file, FALSE, FALSE);
12630 }
12631
12632 static char *
12633 get_archive_member_name_at (struct archive_info * arch,
12634 unsigned long offset,
12635 struct archive_info * nested_arch);
12636
12637 /* Get the name of an archive member from the current archive header.
12638 For simple names, this will modify the ar_name field of the current
12639 archive header. For long names, it will return a pointer to the
12640 longnames table. For nested archives, it will open the nested archive
12641 and get the name recursively. NESTED_ARCH is a single-entry cache so
12642 we don't keep rereading the same information from a nested archive. */
12643
12644 static char *
12645 get_archive_member_name (struct archive_info * arch,
12646 struct archive_info * nested_arch)
12647 {
12648 unsigned long j, k;
12649
12650 if (arch->arhdr.ar_name[0] == '/')
12651 {
12652 /* We have a long name. */
12653 char * endp;
12654 char * member_file_name;
12655 char * member_name;
12656
12657 arch->nested_member_origin = 0;
12658 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
12659 if (arch->is_thin_archive && endp != NULL && * endp == ':')
12660 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
12661
12662 while ((j < arch->longnames_size)
12663 && (arch->longnames[j] != '\n')
12664 && (arch->longnames[j] != '\0'))
12665 j++;
12666 if (arch->longnames[j-1] == '/')
12667 j--;
12668 arch->longnames[j] = '\0';
12669
12670 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
12671 return arch->longnames + k;
12672
12673 /* This is a proxy for a member of a nested archive.
12674 Find the name of the member in that archive. */
12675 member_file_name = adjust_relative_path (arch->file_name, arch->longnames + k, j - k);
12676 if (member_file_name != NULL
12677 && setup_nested_archive (nested_arch, member_file_name) == 0
12678 && (member_name = get_archive_member_name_at (nested_arch, arch->nested_member_origin, NULL)) != NULL)
12679 {
12680 free (member_file_name);
12681 return member_name;
12682 }
12683 free (member_file_name);
12684
12685 /* Last resort: just return the name of the nested archive. */
12686 return arch->longnames + k;
12687 }
12688
12689 /* We have a normal (short) name. */
12690 j = 0;
12691 while ((arch->arhdr.ar_name[j] != '/')
12692 && (j < sizeof (arch->arhdr.ar_name) - 1))
12693 j++;
12694 arch->arhdr.ar_name[j] = '\0';
12695 return arch->arhdr.ar_name;
12696 }
12697
12698 /* Get the name of an archive member at a given OFFSET within an archive ARCH. */
12699
12700 static char *
12701 get_archive_member_name_at (struct archive_info * arch,
12702 unsigned long offset,
12703 struct archive_info * nested_arch)
12704 {
12705 size_t got;
12706
12707 if (fseek (arch->file, offset, SEEK_SET) != 0)
12708 {
12709 error (_("%s: failed to seek to next file name\n"), arch->file_name);
12710 return NULL;
12711 }
12712 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
12713 if (got != sizeof arch->arhdr)
12714 {
12715 error (_("%s: failed to read archive header\n"), arch->file_name);
12716 return NULL;
12717 }
12718 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
12719 {
12720 error (_("%s: did not find a valid archive header\n"), arch->file_name);
12721 return NULL;
12722 }
12723
12724 return get_archive_member_name (arch, nested_arch);
12725 }
12726
12727 /* Construct a string showing the name of the archive member, qualified
12728 with the name of the containing archive file. For thin archives, we
12729 use square brackets to denote the indirection. For nested archives,
12730 we show the qualified name of the external member inside the square
12731 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
12732
12733 static char *
12734 make_qualified_name (struct archive_info * arch,
12735 struct archive_info * nested_arch,
12736 char * member_name)
12737 {
12738 size_t len;
12739 char * name;
12740
12741 len = strlen (arch->file_name) + strlen (member_name) + 3;
12742 if (arch->is_thin_archive && arch->nested_member_origin != 0)
12743 len += strlen (nested_arch->file_name) + 2;
12744
12745 name = (char *) malloc (len);
12746 if (name == NULL)
12747 {
12748 error (_("Out of memory\n"));
12749 return NULL;
12750 }
12751
12752 if (arch->is_thin_archive && arch->nested_member_origin != 0)
12753 snprintf (name, len, "%s[%s(%s)]", arch->file_name, nested_arch->file_name, member_name);
12754 else if (arch->is_thin_archive)
12755 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
12756 else
12757 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
12758
12759 return name;
12760 }
12761
12762 /* Process an ELF archive.
12763 On entry the file is positioned just after the ARMAG string. */
12764
12765 static int
12766 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
12767 {
12768 struct archive_info arch;
12769 struct archive_info nested_arch;
12770 size_t got;
12771 int ret;
12772
12773 show_name = 1;
12774
12775 /* The ARCH structure is used to hold information about this archive. */
12776 arch.file_name = NULL;
12777 arch.file = NULL;
12778 arch.index_array = NULL;
12779 arch.sym_table = NULL;
12780 arch.longnames = NULL;
12781
12782 /* The NESTED_ARCH structure is used as a single-item cache of information
12783 about a nested archive (when members of a thin archive reside within
12784 another regular archive file). */
12785 nested_arch.file_name = NULL;
12786 nested_arch.file = NULL;
12787 nested_arch.index_array = NULL;
12788 nested_arch.sym_table = NULL;
12789 nested_arch.longnames = NULL;
12790
12791 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
12792 {
12793 ret = 1;
12794 goto out;
12795 }
12796
12797 if (do_archive_index)
12798 {
12799 if (arch.sym_table == NULL)
12800 error (_("%s: unable to dump the index as none was found\n"), file_name);
12801 else
12802 {
12803 unsigned int i, l;
12804 unsigned long current_pos;
12805
12806 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
12807 file_name, arch.index_num, arch.sym_size);
12808 current_pos = ftell (file);
12809
12810 for (i = l = 0; i < arch.index_num; i++)
12811 {
12812 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
12813 {
12814 char * member_name;
12815
12816 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
12817
12818 if (member_name != NULL)
12819 {
12820 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
12821
12822 if (qualified_name != NULL)
12823 {
12824 printf (_("Binary %s contains:\n"), qualified_name);
12825 free (qualified_name);
12826 }
12827 }
12828 }
12829
12830 if (l >= arch.sym_size)
12831 {
12832 error (_("%s: end of the symbol table reached before the end of the index\n"),
12833 file_name);
12834 break;
12835 }
12836 printf ("\t%s\n", arch.sym_table + l);
12837 l += strlen (arch.sym_table + l) + 1;
12838 }
12839
12840 if (l & 01)
12841 ++l;
12842 if (l < arch.sym_size)
12843 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
12844 file_name);
12845
12846 if (fseek (file, current_pos, SEEK_SET) != 0)
12847 {
12848 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
12849 ret = 1;
12850 goto out;
12851 }
12852 }
12853
12854 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
12855 && !do_segments && !do_header && !do_dump && !do_version
12856 && !do_histogram && !do_debugging && !do_arch && !do_notes
12857 && !do_section_groups && !do_dyn_syms)
12858 {
12859 ret = 0; /* Archive index only. */
12860 goto out;
12861 }
12862 }
12863
12864 ret = 0;
12865
12866 while (1)
12867 {
12868 char * name;
12869 size_t namelen;
12870 char * qualified_name;
12871
12872 /* Read the next archive header. */
12873 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
12874 {
12875 error (_("%s: failed to seek to next archive header\n"), file_name);
12876 return 1;
12877 }
12878 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
12879 if (got != sizeof arch.arhdr)
12880 {
12881 if (got == 0)
12882 break;
12883 error (_("%s: failed to read archive header\n"), file_name);
12884 ret = 1;
12885 break;
12886 }
12887 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
12888 {
12889 error (_("%s: did not find a valid archive header\n"), arch.file_name);
12890 ret = 1;
12891 break;
12892 }
12893
12894 arch.next_arhdr_offset += sizeof arch.arhdr;
12895
12896 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
12897 if (archive_file_size & 01)
12898 ++archive_file_size;
12899
12900 name = get_archive_member_name (&arch, &nested_arch);
12901 if (name == NULL)
12902 {
12903 error (_("%s: bad archive file name\n"), file_name);
12904 ret = 1;
12905 break;
12906 }
12907 namelen = strlen (name);
12908
12909 qualified_name = make_qualified_name (&arch, &nested_arch, name);
12910 if (qualified_name == NULL)
12911 {
12912 error (_("%s: bad archive file name\n"), file_name);
12913 ret = 1;
12914 break;
12915 }
12916
12917 if (is_thin_archive && arch.nested_member_origin == 0)
12918 {
12919 /* This is a proxy for an external member of a thin archive. */
12920 FILE * member_file;
12921 char * member_file_name = adjust_relative_path (file_name, name, namelen);
12922 if (member_file_name == NULL)
12923 {
12924 ret = 1;
12925 break;
12926 }
12927
12928 member_file = fopen (member_file_name, "rb");
12929 if (member_file == NULL)
12930 {
12931 error (_("Input file '%s' is not readable.\n"), member_file_name);
12932 free (member_file_name);
12933 ret = 1;
12934 break;
12935 }
12936
12937 archive_file_offset = arch.nested_member_origin;
12938
12939 ret |= process_object (qualified_name, member_file);
12940
12941 fclose (member_file);
12942 free (member_file_name);
12943 }
12944 else if (is_thin_archive)
12945 {
12946 /* This is a proxy for a member of a nested archive. */
12947 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
12948
12949 /* The nested archive file will have been opened and setup by
12950 get_archive_member_name. */
12951 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
12952 {
12953 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
12954 ret = 1;
12955 break;
12956 }
12957
12958 ret |= process_object (qualified_name, nested_arch.file);
12959 }
12960 else
12961 {
12962 archive_file_offset = arch.next_arhdr_offset;
12963 arch.next_arhdr_offset += archive_file_size;
12964
12965 ret |= process_object (qualified_name, file);
12966 }
12967
12968 free (qualified_name);
12969 }
12970
12971 out:
12972 if (nested_arch.file != NULL)
12973 fclose (nested_arch.file);
12974 release_archive (&nested_arch);
12975 release_archive (&arch);
12976
12977 return ret;
12978 }
12979
12980 static int
12981 process_file (char * file_name)
12982 {
12983 FILE * file;
12984 struct stat statbuf;
12985 char armag[SARMAG];
12986 int ret;
12987
12988 if (stat (file_name, &statbuf) < 0)
12989 {
12990 if (errno == ENOENT)
12991 error (_("'%s': No such file\n"), file_name);
12992 else
12993 error (_("Could not locate '%s'. System error message: %s\n"),
12994 file_name, strerror (errno));
12995 return 1;
12996 }
12997
12998 if (! S_ISREG (statbuf.st_mode))
12999 {
13000 error (_("'%s' is not an ordinary file\n"), file_name);
13001 return 1;
13002 }
13003
13004 file = fopen (file_name, "rb");
13005 if (file == NULL)
13006 {
13007 error (_("Input file '%s' is not readable.\n"), file_name);
13008 return 1;
13009 }
13010
13011 if (fread (armag, SARMAG, 1, file) != 1)
13012 {
13013 error (_("%s: Failed to read file's magic number\n"), file_name);
13014 fclose (file);
13015 return 1;
13016 }
13017
13018 if (memcmp (armag, ARMAG, SARMAG) == 0)
13019 ret = process_archive (file_name, file, FALSE);
13020 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13021 ret = process_archive (file_name, file, TRUE);
13022 else
13023 {
13024 if (do_archive_index)
13025 error (_("File %s is not an archive so its index cannot be displayed.\n"),
13026 file_name);
13027
13028 rewind (file);
13029 archive_file_size = archive_file_offset = 0;
13030 ret = process_object (file_name, file);
13031 }
13032
13033 fclose (file);
13034
13035 return ret;
13036 }
13037
13038 #ifdef SUPPORT_DISASSEMBLY
13039 /* Needed by the i386 disassembler. For extra credit, someone could
13040 fix this so that we insert symbolic addresses here, esp for GOT/PLT
13041 symbols. */
13042
13043 void
13044 print_address (unsigned int addr, FILE * outfile)
13045 {
13046 fprintf (outfile,"0x%8.8x", addr);
13047 }
13048
13049 /* Needed by the i386 disassembler. */
13050 void
13051 db_task_printsym (unsigned int addr)
13052 {
13053 print_address (addr, stderr);
13054 }
13055 #endif
13056
13057 int
13058 main (int argc, char ** argv)
13059 {
13060 int err;
13061
13062 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13063 setlocale (LC_MESSAGES, "");
13064 #endif
13065 #if defined (HAVE_SETLOCALE)
13066 setlocale (LC_CTYPE, "");
13067 #endif
13068 bindtextdomain (PACKAGE, LOCALEDIR);
13069 textdomain (PACKAGE);
13070
13071 expandargv (&argc, &argv);
13072
13073 parse_args (argc, argv);
13074
13075 if (num_dump_sects > 0)
13076 {
13077 /* Make a copy of the dump_sects array. */
13078 cmdline_dump_sects = (dump_type *)
13079 malloc (num_dump_sects * sizeof (* dump_sects));
13080 if (cmdline_dump_sects == NULL)
13081 error (_("Out of memory allocating dump request table.\n"));
13082 else
13083 {
13084 memcpy (cmdline_dump_sects, dump_sects,
13085 num_dump_sects * sizeof (* dump_sects));
13086 num_cmdline_dump_sects = num_dump_sects;
13087 }
13088 }
13089
13090 if (optind < (argc - 1))
13091 show_name = 1;
13092
13093 err = 0;
13094 while (optind < argc)
13095 err |= process_file (argv[optind++]);
13096
13097 if (dump_sects != NULL)
13098 free (dump_sects);
13099 if (cmdline_dump_sects != NULL)
13100 free (cmdline_dump_sects);
13101
13102 return err;
13103 }
This page took 0.338118 seconds and 4 git commands to generate.