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