xref: /php-src/ext/opcache/jit/ir/ir_elf.h (revision caf102df)
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