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