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