1 /* 2 * IR - Lightweight JIT Compilation Framework 3 * (ELF header definitions) 4 * Copyright (C) 2022 Zend by Perforce. 5 * Authors: Dmitry Stogov <dmitry@php.net> 6 */ 7 8 #ifndef IR_ELF 9 #define IR_ELF 10 11 #if defined(IR_TARGET_X64) || defined(IR_TARGET_AARCH64) 12 # define ELF64 13 #else 14 # undef ELF64 15 #endif 16 17 typedef struct _ir_elf_header { 18 uint8_t emagic[4]; 19 uint8_t eclass; 20 uint8_t eendian; 21 uint8_t eversion; 22 uint8_t eosabi; 23 uint8_t eabiversion; 24 uint8_t epad[7]; 25 uint16_t type; 26 uint16_t machine; 27 uint32_t version; 28 uintptr_t entry; 29 uintptr_t phofs; 30 uintptr_t shofs; 31 uint32_t flags; 32 uint16_t ehsize; 33 uint16_t phentsize; 34 uint16_t phnum; 35 uint16_t shentsize; 36 uint16_t shnum; 37 uint16_t shstridx; 38 } ir_elf_header; 39 40 typedef struct ir_elf_sectheader { 41 uint32_t name; 42 uint32_t type; 43 uintptr_t flags; 44 uintptr_t addr; 45 uintptr_t ofs; 46 uintptr_t size; 47 uint32_t link; 48 uint32_t info; 49 uintptr_t align; 50 uintptr_t entsize; 51 } ir_elf_sectheader; 52 53 #define ELFSECT_IDX_ABS 0xfff1 54 55 enum { 56 ELFSECT_TYPE_PROGBITS = 1, 57 ELFSECT_TYPE_SYMTAB = 2, 58 ELFSECT_TYPE_STRTAB = 3, 59 ELFSECT_TYPE_NOBITS = 8, 60 ELFSECT_TYPE_DYNSYM = 11, 61 }; 62 63 #define ELFSECT_FLAGS_WRITE (1 << 0) 64 #define ELFSECT_FLAGS_ALLOC (1 << 1) 65 #define ELFSECT_FLAGS_EXEC (1 << 2) 66 #define ELFSECT_FLAGS_TLS (1 << 10) 67 68 typedef struct ir_elf_symbol { 69 #ifdef ELF64 70 uint32_t name; 71 uint8_t info; 72 uint8_t other; 73 uint16_t sectidx; 74 uintptr_t value; 75 uint64_t size; 76 #else 77 uint32_t name; 78 uintptr_t value; 79 uint32_t size; 80 uint8_t info; 81 uint8_t other; 82 uint16_t sectidx; 83 #endif 84 } ir_elf_symbol; 85 86 #define ELFSYM_BIND(info) ((info) >> 4) 87 #define ELFSYM_TYPE(info) ((info) & 0xf) 88 #define ELFSYM_INFO(bind, type) (((bind) << 4) | (type)) 89 90 enum { 91 ELFSYM_TYPE_DATA = 2, 92 ELFSYM_TYPE_FUNC = 2, 93 ELFSYM_TYPE_FILE = 4, 94 }; 95 96 enum { 97 ELFSYM_BIND_LOCAL = 0, 98 ELFSYM_BIND_GLOBAL = 1, 99 }; 100 101 #endif 102