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