diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2024-03-06 19:20:34 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2024-03-06 19:20:34 -0500 |
| commit | 828fff839f4e4de3e9582405dfec567531000ebc (patch) | |
| tree | ee0db0607edb0c76c653078672201c85e8a96d19 /view/elf/elfview.h | |
| parent | 47894a1ce20090849ad304c68e6c0b889665eda3 (diff) | |
Move view modules into the API repo
Diffstat (limited to 'view/elf/elfview.h')
| -rw-r--r-- | view/elf/elfview.h | 558 |
1 files changed, 558 insertions, 0 deletions
diff --git a/view/elf/elfview.h b/view/elf/elfview.h new file mode 100644 index 00000000..7df78d01 --- /dev/null +++ b/view/elf/elfview.h @@ -0,0 +1,558 @@ +#pragma once + +#include "binaryninjaapi.h" +#include <exception> + +#define ELF_PT_NULL 0 +#define ELF_PT_LOAD 1 +#define ELF_PT_DYNAMIC 2 +#define ELF_PT_INTERP 3 +#define ELF_PT_NOTE 4 +#define ELF_PT_SHLIB 5 +#define ELF_PT_PHDR 6 +#define ELF_PT_TLS 7 /* Thread-local storage segment */ +#define ELF_PT_NUM 8 /* Number of defined types */ +#define ELF_PT_LOOS 0x60000000 /* Start of OS-specific */ +#define ELF_PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ +#define ELF_PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ +#define ELF_PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ + +#define ELF_PT_LOSUNW 0x6ffffffa +#define ELF_PT_SUNWBSS 0x6ffffffb +#define ELF_PT_SUNWSTACK 0x6ffffffa +#define ELF_PT_HISUNW 0x6fffffff +#define ELF_PT_LOPROC 0x70000000 +#define ELF_PT_HIPROC 0x7fffffff + +#define ELF_PT_MIPS_REGINFO 0x70000000 /* Register usage information */ +#define ELF_PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table */ +#define ELF_PT_MIPS_OPTIONS 0x70000002 +#define ELF_PT_MIPS_ABIFLAGS 0x70000003 /* FP mode requirement */ + +// x86-64 program header types. +// These all contain stack unwind tables. +#define ELF_PT_GNU_EH_FRAME 0x6474e550 +#define ELF_PT_SUNW_EH_FRAME 0x6474e550 +#define ELF_PT_SUNW_UNWIND 0x6464e550 +#define ELF_PT_GNU_STACK 0x6474e551 // Indicates stack executability. +#define ELF_PT_GNU_RELRO 0x6474e552 // Read-only after relocation. +#define ELF_PT_OPENBSD_RANDOMIZE 0x65a3dbe6 // Fill with random data. +#define ELF_PT_OPENBSD_WXNEEDED 0x65a3dbe7 // Program does W^X violations. +#define ELF_PT_OPENBSD_BOOTDATA 0x65a41be6 // Section for boot arguments. + // ARM program header types. +#define PT_ARM_ARCHEXT 0x70000000 // Platform architecture compatibility info + // These all contain stack unwind tables. +#define PT_ARM_EXIDX 0x70000001 +#define PT_ARM_UNWIND 0x70000001 + + // MIPS program header types. +#define PT_MIPS_REGINFO 0x70000000 // Register usage information. +#define PT_MIPS_RTPROC 0x70000001 // Runtime procedure table. +#define PT_MIPS_OPTIONS 0x70000002 // Options segment. +#define PT_MIPS_ABIFLAGS 0x70000003 // Abiflags segment. + + // WebAssembly program header types. + #define PT_WEBASSEMBLY_FUNCTIONS ELF_PT_LOPROC + 0 // Function definitions. + +#define ELF_DT_NULL 0 +#define ELF_DT_NEEDED 1 +#define ELF_DT_PLTRELSZ 2 +#define ELF_DT_PLTGOT 3 +#define ELF_DT_HASH 4 +#define ELF_DT_STRTAB 5 +#define ELF_DT_SYMTAB 6 +#define ELF_DT_RELA 7 +#define ELF_DT_RELASZ 8 +#define ELF_DT_RELAENT 9 +#define ELF_DT_STRSZ 10 +#define ELF_DT_DYNSYM 11 +#define ELF_DT_SYMENT 11 +#define ELF_DT_INIT 12 +#define ELF_DT_FINI 13 +#define ELF_DT_SONAME 14 +#define ELF_DT_RPATH 15 +#define ELF_DT_SYMBOLIC 16 +#define ELF_DT_REL 17 +#define ELF_DT_RELSZ 18 +#define ELF_DT_RELENT 19 +#define ELF_DT_PLTREL 20 +#define ELF_DT_DEBUG 21 +#define ELF_DT_TEXTREL 22 +#define ELF_DT_JMPREL 23 +#define ELF_DT_BIND_NOW 24 +#define ELF_DT_INIT_ARRAY 25 +#define ELF_DT_FINI_ARRAY 26 +#define ELF_DT_INIT_ARRAYSZ 27 +#define ELF_DT_FINI_ARRAYSZ 28 +#define ELF_DT_RUNPATH 29 +#define ELF_DT_FLAGS 30 +#define ELF_DT_ENCODING 31 +#define ELF_DT_PREINIT_ARRAY 32 +#define ELF_DT_PREINIT_ARRAYSZ 33 + +#define ELF_DT_LOOS 0x6000000D +#define ELF_DT_SUNW_RTLDINF 0x6000000E +#define ELF_DT_HIOS 0x6FFFF000 +#define ELF_DT_VALRNGLO 0x6FFFFD00 +#define ELF_DT_CHECKSUM 0x6FFFFDF8 +#define ELF_DT_PLTPADSZ 0x6FFFFDF9 +#define ELF_DT_MOVEEN 0x6FFFFDFA +#define ELF_DT_MOVES 0x6FFFFDFB +#define ELF_DT_FEATURE_1 0x6FFFFDFC +#define ELF_DT_POSFLAG_1 0x6FFFFDFD +#define ELF_DT_SYMINSZ 0x6FFFFDFE +#define ELF_DT_SYMINENT 0x6FFFFDFF +#define ELF_DT_VALRNGH 0x6FFFFDFF +#define ELF_DT_ADDRRNGLO 0x6FFFFE00 +#define ELF_DT_GNU_HASH 0x6FFFFEF5 +#define ELF_DT_CONFIG 0x6FFFFEFA +#define ELF_DT_DEPAUDIT 0x6FFFFEFB +#define ELF_DT_AUDIT 0x6FFFFEFC +#define ELF_DT_PLTPAD 0x6FFFFEFD +#define ELF_DT_MOVETAB 0x6FFFFEFE +#define ELF_DT_SYMINFO 0x6FFFFEFF +#define ELF_DT_ADDRRNGHI 0x6FFFFEFF +#define ELF_DT_RELACOUNT 0x6FFFFFF9 +#define ELF_DT_RELCOUNT 0x6FFFFFFA +#define ELF_DT_FLAGS_1 0x6FFFFFFB +#define ELF_DT_VERDEF 0x6FFFFFFC +#define ELF_DT_VERDEFNUM 0x6FFFFFFD +#define ELF_DT_VERNEED 0x6FFFFFFE +#define ELF_DT_VERNEEDNUM 0x6FFFFFFF +#define ELF_DT_VERSYM 0x6FFFFFF0 + +#define ELF_DT_LOPROC 0x70000000 + +#define ELF_DT_SPARC_REGISTER 0x70000001 + +#define ELF_DT_MIPS_RLD_VERSION 0x70000001 +#define ELF_DT_MIPS_TIME_STAMP 0x70000002 +#define ELF_DT_MIPS_ICHECKSUM 0x70000003 +#define ELF_DT_MIPS_IVERSION 0x70000004 +#define ELF_DT_MIPS_FLAGS 0x70000005 +#define ELF_DT_MIPS_BASE_ADDRESS 0x70000006 +#define ELF_DT_MIPS_CONFLICT 0x70000008 +#define ELF_DT_MIPS_LIBLIST 0x70000009 +#define ELF_DT_MIPS_LOCAL_GOTNO 0x7000000A +#define ELF_DT_MIPS_CONFLICTNO 0x7000000B +#define ELF_DT_MIPS_LIBLISTNO 0x70000010 +#define ELF_DT_MIPS_SYMTABNO 0x70000011 +#define ELF_DT_MIPS_UNREFEXTNO 0x70000012 +#define ELF_DT_MIPS_GOTSYM 0x70000013 +#define ELF_DT_MIPS_HIPAGENO 0x70000014 +#define ELF_DT_MIPS_RLD_MAP 0x70000016 +#define ELF_DT_MIPS_RLD_MAP_REL 0x70000035 + +#define ELF_DT_AUXILIARY 0x7FFFFFFD +#define ELF_DT_USED 0x7FFFFFFE +#define ELF_DT_FILTER 0x7FFFFFFF +#define ELF_DT_HIPROC 0x7FFFFFFF + +#define ELF_STT_NOTYPE 0 +#define ELF_STT_OBJECT 1 +#define ELF_STT_FUNC 2 +#define ELF_STT_SECTION 3 +#define ELF_STT_FILE 4 +#define ELF_STT_COMMON 5 +#define ELF_STT_TLS 6 +// GNU/Linux specific +#define ELF_STT_GNU_IFUNC 10 + +#define ELF_STB_LOCAL 0 +#define ELF_STB_GLOBAL 1 +#define ELF_STB_WEAK 2 +#define ELF_STB_LOPROC 13 +#define ELF_STB_HIPROC 15 + +#define ELF_ST_TYPE(t) ((t) & 0xf) +#define ELF_ST_BIND(b) ((b) >> 4) + +#define ELF_RELOC_COPY 5 +#define ELF_RELOC_GLOBAL 6 +#define ELF_RELOC_JUMP_SLOT 7 + +#define ET_NONE 0 // No file type +#define ET_REL 1 // Relocatable file +#define ET_EXEC 2 // Executable file +#define ET_DYN 3 // Shared object file +#define ET_CORE 4 // Core file +#define ET_NUM 5 // Number of defined types + +#define EM_NONE 0 // No machine +#define EM_M32 1 // AT&T WE 32100 +#define EM_SPARC 2 // SUN SPARC +#define EM_386 3 // Intel 80386 +#define EM_68K 4 // Motorola m68k family +#define EM_88K 5 // Motorola m88k family +#define EM_860 7 // Intel 80860 +#define EM_MIPS 8 // MIPS R3000 big-endian +#define EM_S370 9 // IBM System/370 +#define EM_MIPS_RS3_LE 10 // MIPS R3000 little-endian +#define EM_PARISC 15 // HPPA +#define EM_VPP500 17 // Fujitsu VPP500 +#define EM_SPARC32PLUS 18 // Sun's "v8plus" +#define EM_960 19 // Intel 80960 +#define EM_PPC 20 // PowerPC +#define EM_PPC64 21 // PowerPC 64-bit +#define EM_S390 22 // IBM S390 +#define EM_V800 36 // NEC V800 series +#define EM_FR20 37 // Fujitsu FR20 +#define EM_RH32 38 // TRW RH-32 +#define EM_RCE 39 // Motorola RCE +#define EM_ARM 40 // ARM +#define EM_FAKE_ALPHA 41 // Digital Alpha +#define EM_SH 42 // Hitachi SH +#define EM_SPARCV9 43 // SPARC v9 64-bit +#define EM_TRICORE 44 // Siemens Tricore +#define EM_ARC 45 // Argonaut RISC Core +#define EM_H8_300 46 // Hitachi H8/300 +#define EM_H8_300H 47 // Hitachi H8/300H +#define EM_H8S 48 // Hitachi H8S +#define EM_H8_500 49 // Hitachi H8/500 +#define EM_IA_64 50 // Intel Merced +#define EM_MIPS_X 51 // Stanford MIPS-X +#define EM_COLDFIRE 52 // Motorola Coldfire +#define EM_68HC12 53 // Motorola M68HC12 +#define EM_MMA 54 // Fujitsu MMA Multimedia Accelerator +#define EM_PCP 55 // Siemens PCP +#define EM_NCPU 56 // Sony nCPU embeeded RISC +#define EM_NDR1 57 // Denso NDR1 microprocessor +#define EM_STARCORE 58 // Motorola Start*Core processor +#define EM_ME16 59 // Toyota ME16 processor +#define EM_ST100 60 // STMicroelectronic ST100 processor +#define EM_TINYJ 61 // Advanced Logic Corp. Tinyj emb.fam +#define EM_X86_64 62 // AMD x86-64 architecture +#define EM_PDSP 63 // Sony DSP Processor +#define EM_FX66 66 // Siemens FX66 microcontroller +#define EM_ST9PLUS 67 // STMicroelectronics ST9+ 8/16 mc +#define EM_ST7 68 // STmicroelectronics ST7 8 bit mc +#define EM_68HC16 69 // Motorola MC68HC16 microcontroller +#define EM_68HC11 70 // Motorola MC68HC11 microcontroller +#define EM_68HC08 71 // Motorola MC68HC08 microcontroller +#define EM_68HC05 72 // Motorola MC68HC05 microcontroller +#define EM_SVX 73 // Silicon Graphics SVx +#define EM_ST19 74 // STMicroelectronics ST19 8 bit mc +#define EM_VAX 75 // Digital VAX +#define EM_CRIS 76 // Axis Communications 32-bit embedded processor +#define EM_JAVELIN 77 // Infineon Technologies 32-bit embedded processor +#define EM_FIREPATH 78 // Element 14 64-bit DSP Processor +#define EM_ZSP 79 // LSI Logic 16-bit DSP Processor +#define EM_MMIX 80 // Donald Knuth's educational 64-bit processor +#define EM_HUANY 81 // Harvard University machine-independent object files +#define EM_PRISM 82 // SiTera Prism +#define EM_AVR 83 // Atmel AVR 8-bit microcontroller +#define EM_FR30 84 // Fujitsu FR30 +#define EM_D10V 85 // Mitsubishi D10V +#define EM_D30V 86 // Mitsubishi D30V +#define EM_V850 87 // NEC v850 +#define EM_M32R 88 // Mitsubishi M32R +#define EM_MN10300 89 // Matsushita MN10300 +#define EM_MN10200 90 // Matsushita MN10200 +#define EM_PJ 91 // picoJava +#define EM_OPENRISC 92 // OpenRISC 32-bit embedded processor +#define EM_ARC_A5 93 // ARC Cores Tangent-A5 +#define EM_XTENSA 94 // Tensilica Xtensa Architecture +#define EM_ALTERA_NIOS2 113 // Altera Nios II +#define EM_AARCH64 183 // ARM AARCH64 +#define EM_TILEPRO 188 // Tilera TILEPro +#define EM_MICROBLAZE 189 // Xilinx MicroBlaze +#define EM_TILEGX 191 // Tilera TILE-Gx +#define EM_NUM 192 + +// Section Header Types +#define ELF_SHT_NULL 0 +#define ELF_SHT_PROGBITS 1 +#define ELF_SHT_SYMTAB 2 +#define ELF_SHT_STRTAB 3 +#define ELF_SHT_RELA 4 +#define ELF_SHT_HASH 5 +#define ELF_SHT_DYNAMIC 6 +#define ELF_SHT_NOTE 7 +#define ELF_SHT_NOBITS 8 +#define ELF_SHT_REL 9 +#define ELF_SHT_SHLIB 10 +#define ELF_SHT_DYNSYM 11 +#define ELF_SHT_LOPROC 0x70000000 // (take note that this only shows if none of the below are) +#define ELF_SHT_HIPROC 0x7fffffff // (take note that this only shows if none of the below are) +#define ELF_SHT_LOUSER 0x80000000 +#define ELF_SHT_HIUSER 0xffffffff + +#define ELF_SHT_EXT 0x70000000 // PA-RISC and Intel Itanium Only - Section contains product-specific extension bits +#define ELF_SHT_UNWIND 0x70000001 // PA-RISC, Intel Itanium, and AMD64 Only - Section contains unwind function table entries for stack unwinding +#define ELF_SHT_PARISC_DOC 0x70000002 // PA-RISC Only - Section contains debug information for optimized code +#define ELF_SHT_PARISC_ANNOT 0x70000003 // PA-RISC Only - Section contains code annotations Name Value Meaning +#define ELF_SHT_IA_64_LOPSREG 0x78000000 // Intel Itanium Only - Low section of operating system identification bits (and implimentation-specific types) +#define ELF_SHT_IA_64_HIPSREG 0x7fffffff // Intel Itanium Only - High section of operating system identification bits (and implimentation-specific types) +#define ELF_SHT_IA_64_PRIORITY_INIT 0x79000000 // Intel Itanium Only - Section contains priority initialization records + +// Section Header Flags +#define ELF_SHF_WRITE 0x1 // Section is writable +#define ELF_SHF_ALLOC 0x2 // Section occupies memory during execution (is a mapped segment) +#define ELF_SHF_EXECINSTR 0x4 // Section is executable +#define ELF_SHF_MASKOS 0x0ff00000 // OS-specific semantics +#define ELF_SHF_MASKPROC 0xf0000000 // Processor specific (take note that this only shows if none of the below are) + +// LLVM and GoLang Specific +#define ELF_SHF_MERGE 0x10 // Section may be merged +#define ELF_SHF_STRINGS 0x20 // Section contains strings +#define ELF_SHF_INFO_LINK 0x40 // sh_info holds section index +#define ELF_SHF_LINK_ORDER 0x80 // Special ordering requirements +#define ELF_SHF_OS_NONCONFORMING 0x100 // OS-specific processing required +#define ELF_SHF_GROUP 0x200 // Member of section group +#define ELF_SHF_TLS 0x400 // Section contains TLS data +#define ELF_SHF_COMPRESSED 0x800 // Section is compressed + +// Arch Specific +#define ELF_SHF_ENTRYSECT 0x10000000 // ARM only - Section contains an entrypoint +#define ELF_SHF_COMDEF 0x80000000 // ARM only - Section may be multiply defined in the input to a link step +#define ELF_SHF_AMD64_LARGE 0x10000000 // AMD64 Only - Section can be >2GB +#define ELF_SHF_IA_64_SHORT 0x10000000 // Intel Itanium Only - Section contains objects referenced by gp, so must be position near gp +#define ELF_SHF_IA_64_NORECOV 0x20000000 // Intel Itanium Only - Section contains speculative instructions without recovery code +#define ELF_SHF_MIPS_GPREL 0x10000000 // MIPS Only - Section contains global data +#define ELF_SHF_PARISC_SHORT 0x20000000 // PA-RISC Only - Section should be near gp +#define ELF_SHF_PARISC_HUGE 0x40000000 // PA-RISC Only - Section should be allocated far from gp +#define ELF_SHF_PARISC_SBP 0x80000000 // PA-RISC Only - Section contains code compiled for static branch prediction +#define ELF_SHF_EXCLUDE 0x80000000 // PPC Only - Section is excluded from executable and SO's when they're not to be further relocated + +#define EV_NONE 0 // Invalid ELF version +#define EV_CURRENT 1 // Current version +#define EV_NUM 2 + +#define EF_ARM_BE8 0x00800000 // ELF contains BE-8 code for ARMv6 processor + +#define PF_X (1 << 0) // Segment is executable +#define PF_W (1 << 1) // Segment is writable +#define PF_R (1 << 2) // Segment is readable + +#define ELF_SHN_UNDEF 0 +#define ELF_SHN_LORESERVE 0xff00 +#define ELF_SHN_LOPROC 0xff00 +#define ELF_SHN_HIPROC 0xff1f +#define ELF_SHN_ABS 0xfff1 +#define ELF_SHN_COMMON 0xfff2 +#define ELF_SHN_HIRESERVE 0xffff + +// TODO : Add these (MIPs Only): +// #define ELF_SHN_MIPS_ACOMMON 0xff00 +// #define ELF_SHN_MIPS_TEXT 0xff01 +// #define ELF_SHN_MIPS_DATA 0xff02 +// #define ELF_SHN_MIPS_SCOMMON 0xff03 +// #define ELF_SHN_MIPS_SUNDEFINED 0xff04 + +// ARM ONLY +#define R_ARM_TLS_DTPMOD32 0x11 +#define R_ARM_TLS_DTPOFF32 0x12 + +namespace BinaryNinja +{ + class ElfFormatException: public std::exception + { + std::string m_message; + + public: + ElfFormatException(const std::string& msg = "invalid format"): m_message(msg) {} + virtual const char* what() const NOEXCEPT { return m_message.c_str(); } + }; + + struct ElfIdent + { + char signature[4]; + uint8_t fileClass; + uint8_t encoding; + uint8_t version; + uint8_t os; + uint8_t abiVersion; + uint8_t pad[7]; + }; + + struct ElfCommonHeader + { + uint16_t type; + uint16_t arch; + uint32_t version; + }; + + struct Elf32Header + { + uint32_t entry; + uint32_t programHeaderOffset; + uint32_t sectionHeaderOffset; + uint32_t flags; + uint16_t headerSize; + uint16_t programHeaderSize; + uint16_t programHeaderCount; + uint16_t sectionHeaderSize; + uint16_t sectionHeaderCount; + uint16_t stringTable; + }; + + struct Elf32ProgramHeader + { + uint32_t type; + uint32_t offset; + uint32_t virtualAddress; + uint32_t physicalAddress; + uint32_t fileSize; + uint32_t memorySize; + uint32_t flags; + uint32_t align; + }; + + struct Elf32SectionHeader + { + uint32_t name; + uint32_t type; + uint32_t flags; + uint32_t address; + uint32_t offset; + uint32_t size; + uint32_t link; + uint32_t info; + uint32_t align; + uint32_t entrySize; + }; + + struct Elf64Header + { + uint64_t entry; + uint64_t programHeaderOffset; + uint64_t sectionHeaderOffset; + uint32_t flags; + uint16_t headerSize; + uint16_t programHeaderSize; + uint16_t programHeaderCount; + uint16_t sectionHeaderSize; + uint16_t sectionHeaderCount; + uint16_t stringTable; + }; + + struct Elf64ProgramHeader + { + uint32_t type; + uint32_t flags; + uint64_t offset; + uint64_t virtualAddress; + uint64_t physicalAddress; + uint64_t fileSize; + uint64_t memorySize; + uint64_t align; + }; + + struct Elf64SectionHeader + { + uint32_t name; + uint32_t type; + uint64_t flags; + uint64_t address; + uint64_t offset; + uint64_t size; + uint32_t link; + uint32_t info; + uint64_t align; + uint64_t entrySize; + }; + + struct ElfSymbolTableEntry + { + uint32_t nameOffset; + uint8_t type; + BNSymbolBinding binding; + uint8_t other; + uint16_t section; + uint64_t value; + uint64_t size; + std::string name; + bool dynamic; + }; + + struct ELFRelocEntry + { + uint64_t offset, sym, relocType, addend; + size_t sectionIdx; + bool implicit; + ELFRelocEntry(uint64_t o, uint64_t s, uint64_t r, uint64_t a, size_t idx, bool imp): offset(o), sym(s), relocType(r), + addend(a), sectionIdx(idx), implicit(imp) {} + }; + + class ElfView: public BinaryView + { + bool m_parseOnly, m_backedByDatabase; + uint64_t m_entryPoint; + uint64_t m_sectionHeaderOffset, m_programHeaderOffset; + size_t m_sectionHeaderCount, m_programHeaderCount; + uint64_t m_fileSize; + BNEndianness m_endian; + size_t m_addressSize; + ElfIdent m_ident; + ElfCommonHeader m_commonHeader; + Ref<Architecture> m_arch; + Ref<Platform> m_plat = nullptr; + uint32_t m_headerFlags; + bool m_elf32; + bool m_objectFile; + Ref<Logger> m_logger; + bool m_extractMangledTypes; + bool m_simplifyTemplates; + bool m_relocatable = false; + std::map<uint64_t, std::vector<char>> m_stringTableCache; + + // Section and program headers, internally use 64-bit form as it is a superset of 32-bit + std::vector<Elf64SectionHeader> m_elfSections; + std::vector<Elf64ProgramHeader> m_programHeaders; + Elf64SectionHeader m_symbolTableSection, m_dynamicSymbolTableSection; + Elf64SectionHeader m_auxSymbolTable, m_dynamicStringTable, m_sectionStringTable, m_sectionOpd; + Elf64ProgramHeader m_dynamicTable; + Elf64ProgramHeader m_tlsSegment; + std::map<uint64_t, uint64_t> m_localGotEntries; + std::set<uint64_t> m_gotEntryLocations; + std::vector<BNRelocationInfo> m_relocationInfo; + + size_t m_auxSymbolTableEntrySize = 0; + size_t m_numDynamicTableEntries = 0; + uint64_t m_hashHeader = 0; + uint64_t m_gnuHashHeader = 0; + + SymbolQueue* m_symbolQueue = nullptr; + + void DefineElfSymbol(BNSymbolType type, const std::string& name, uint64_t addr, bool gotEntry, + BNSymbolBinding binding, size_t size, Ref<Type> typeObj=nullptr); + + void ApplyTypesToParentStringTable(const Elf64SectionHeader& section, const bool offset = true); + void ApplyTypesToStringTable(const Elf64SectionHeader& section, const int64_t imageBaseAdjustment, const bool offset = true); + std::string ReadStringTable(BinaryReader& view, const Elf64SectionHeader& section, uint64_t offset); + bool ParseSymbolTableEntry(BinaryReader& reader, ElfSymbolTableEntry& entry, uint64_t sym, + const Elf64SectionHeader& symbolTable, const Elf64SectionHeader& stringTable, bool dynamic); + + std::vector<ElfSymbolTableEntry> ParseSymbolTable(BinaryReader& reader, const Elf64SectionHeader& symbolTableSection, + const Elf64SectionHeader& section, bool dynamic, size_t startEntry=0); + + virtual uint64_t PerformGetEntryPoint() const override; + + virtual bool PerformIsExecutable() const override { return true; } + virtual BNEndianness PerformGetDefaultEndianness() const override; + virtual bool PerformIsRelocatable() const override; + virtual size_t PerformGetAddressSize() const override; + void GetRelocEntries(BinaryReader& reader, const std::vector<Elf64SectionHeader>& sections, + bool implicit, std::vector<ELFRelocEntry>& result); + bool DerefPpc64Descriptor(BinaryReader& reader, uint64_t addr, uint64_t& result); + public: + ElfView(BinaryView* data, bool parseOnly = false); + ~ElfView(); + + virtual bool Init() override; + }; + + class ElfViewType: public BinaryViewType + { + Ref<Logger> m_logger; + public: + ElfViewType(); + virtual Ref<BinaryView> Create(BinaryView* data) override; + virtual Ref<BinaryView> Parse(BinaryView* data) override; + virtual bool IsTypeValidForData(BinaryView* data) override; + virtual uint64_t ParseHeaders(BinaryView* data, ElfIdent& ident, ElfCommonHeader& commonHeader, Elf64Header& header, Ref<Architecture>* arch, Ref<Platform>* plat, std::string& errorMsg, BNEndianness& endianness); + virtual Ref<Settings> GetLoadSettingsForData(BinaryView* data) override; + }; + + void InitElfViewType(); +} |
