PatchworkOS
Loading...
Searching...
No Matches
elf.h
Go to the documentation of this file.
1#ifndef _SYS_ELF_H
2#define _SYS_ELF_H 1
3
4#include <stdint.h>
5
19/* ELF Identification indices */
20#define ELF_IDENT_MAG0 0
21#define ELF_IDENT_MAG1 1
22#define ELF_IDENT_MAG2 2
23#define ELF_IDENT_MAG3 3
24#define ELF_IDENT_CLASS 4
25#define ELF_IDENT_DATA 5
26#define ELF_IDENT_VERSION 6
27#define ELF_IDENT_OSABI 7
28#define ELF_IDENT_ABIVERSION 8
29#define ELF_IDENT_PAD 9
30
31/* ELF Magic number */
32#define ELF_MAG0 0x7F
33#define ELF_MAG1 'E'
34#define ELF_MAG2 'L'
35#define ELF_MAG3 'F'
36
37/* ELF Class */
38#define ELF_CLASS_NONE 0
39#define ELF_CLASS_32 1
40#define ELF_CLASS_64 2
41
42/* ELF Data encoding */
43#define ELF_DATA_NONE 0
44#define ELF_DATA_2LSB 1 /* Little endian */
45#define ELF_DATA_2MSB 2 /* Big endian */
46
47/* ELF Version */
48#define ELF_VERSION_NONE 0
49#define ELF_VERSION_CURRENT 1
50
51/* ELF OS/ABI */
52#define ELF_OSABI_SYSV 0
53#define ELF_OSABI_HPUX 1
54#define ELF_OSABI_NETBSD 2
55#define ELF_OSABI_LINUX 3
56#define ELF_OSABI_SOLARIS 6
57#define ELF_OSABI_AIX 7
58#define ELF_OSABI_IRIX 8
59#define ELF_OSABI_FREEBSD 9
60#define ELF_OSABI_TRU64 10
61#define ELF_OSABI_MODESTO 11
62#define ELF_OSABI_OPENBSD 12
63#define ELF_OSABI_ARM_AEABI 64
64#define ELF_OSABI_ARM 97
65#define ELF_OSABI_STANDALONE 255
66
67/* ELF File types */
69#define ELF_HDR_TYPE_NONE 0x0
70#define ELF_HDR_TYPE_REL 0x1
71#define ELF_HDR_TYPE_EXEC 0x2
72#define ELF_HDR_TYPE_DYN 0x3
73#define ELF_HDR_TYPE_CORE 0x4
74#define ELF_HDR_TYPE_LOW_PROC 0xff00
75#define ELF_HDR_TYPE_HIGH_PROC 0xffff
76
77/* ELF Machine types */
79#define ELF_HDR_MACHINE_NONE 0x00
80#define ELF_HDR_MACHINE_M32 0x01
81#define ELF_HDR_MACHINE_SPARC 0x02
82#define ELF_HDR_MACHINE_386 0x03
83#define ELF_HDR_MACHINE_68K 0x04
84#define ELF_HDR_MACHINE_88K 0x05
85#define ELF_HDR_MACHINE_860 0x07
86#define ELF_HDR_MACHINE_MIPS 0x08
87#define ELF_HDR_MACHINE_PARISC 0x0F
88#define ELF_HDR_MACHINE_SPARC32PLUS 0x12
89#define ELF_HDR_MACHINE_PPC 0x14
90#define ELF_HDR_MACHINE_PPC64 0x15
91#define ELF_HDR_MACHINE_S390 0x16
92#define ELF_HDR_MACHINE_ARM 0x28
93#define ELF_HDR_MACHINE_SH 0x2A
94#define ELF_HDR_MACHINE_SPARCV9 0x2B
95#define ELF_HDR_MACHINE_IA64 0x32
96#define ELF_HDR_MACHINE_X86_64 0x3E
97#define ELF_HDR_MACHINE_AARCH64 0xB7
98#define ELF_HDR_MACHINE_RISCV 0xF3
99
100/* ELF Version */
102#define ELF_HDR_VERSION_NONE 0
103#define ELF_HDR_VERSION_1 1
104
105/* ELF Program header types */
107#define ELF_PHDR_TYPE_NULL 0
108#define ELF_PHDR_TYPE_LOAD 1
109#define ELF_PHDR_TYPE_DYNAMIC 2
110#define ELF_PHDR_TYPE_INTERP 3
111#define ELF_PHDR_TYPE_NOTE 4
112#define ELF_PHDR_TYPE_SHLIB 5
113#define ELF_PHDR_TYPE_PHDR 6
114#define ELF_PHDR_TYPE_TLS 7
115#define ELF_PHDR_TYPE_LOW_OS 0x60000000
116#define ELF_PHDR_TYPE_HIGH_OS 0x6fffffff
117#define ELF_PHDR_TYPE_LOW_PROC 0x70000000
118#define ELF_PHDR_TYPE_HIGH_PROC 0x7fffffff
119/* GNU Extensions */
120#define ELF_PHDR_TYPE_GNU_EH_FRAME (ELF_PHDR_TYPE_LOW_OS + 0x474e550)
121#define ELF_PHDR_TYPE_GNU_STACK (ELF_PHDR_TYPE_LOW_OS + 0x474e551)
122#define ELF_PHDR_TYPE_GNU_RELRO (ELF_PHDR_TYPE_LOW_OS + 0x474e552)
123#define ELF_PHDR_TYPE_GNU_PROPERTY (ELF_PHDR_TYPE_LOW_OS + 0x474e553)
124
125/* ELF Program header flags */
127#define ELF_PHDR_FLAGS_EXECUTE (1 << 0)
128#define ELF_PHDR_FLAGS_WRITE (1 << 1)
129#define ELF_PHDR_FLAGS_READ (1 << 2)
130
131/* ELF Section header types */
133#define ELF_SHDR_TYPE_NULL 0
134#define ELF_SHDR_TYPE_PROGBITS 1
135#define ELF_SHDR_TYPE_SYMTAB 2
136#define ELF_SHDR_TYPE_STRTAB 3
137#define ELF_SHDR_TYPE_RELA 4
138#define ELF_SHDR_TYPE_HASH 5
139#define ELF_SHDR_TYPE_DYNAMIC 6
140#define ELF_SHDR_TYPE_NOTE 7
141#define ELF_SHDR_TYPE_NOBITS 8
142#define ELF_SHDR_TYPE_REL 9
143#define ELF_SHDR_TYPE_SHLIB 10
144#define ELF_SHDR_TYPE_DYNSYM 11
145#define ELF_SHDR_TYPE_INIT_ARRAY 14
146#define ELF_SHDR_TYPE_FINI_ARRAY 15
147#define ELF_SHDR_TYPE_PREINIT_ARRAY 16
148#define ELF_SHDR_TYPE_GROUP 17
149#define ELF_SHDR_TYPE_SYMTAB_SHNDX 18
150#define ELF_SHDR_TYPE_LOW_OS 0x60000000
151#define ELF_SHDR_TYPE_HIGH_OS 0x6fffffff
152#define ELF_SHDR_TYPE_LOW_PROC 0x70000000
153#define ELF_SHDR_TYPE_HIGH_PROC 0x7fffffff
154#define ELF_SHDR_TYPE_LOW_USER 0x80000000
155#define ELF_SHDR_TYPE_HIGH_USER 0x8fffffff
156
157/* ELF Section header flags */
159#define ELF_SHDR_FLAGS_WRITE (1 << 0)
160#define ELF_SHDR_FLAGS_ALLOC (1 << 1)
161#define ELF_SHDR_FLAGS_EXECINSTR (1 << 2)
162#define ELF_SHDR_FLAGS_MERGE (1 << 4)
163#define ELF_SHDR_FLAGS_STRINGS (1 << 5)
164#define ELF_SHDR_FLAGS_INFO_LINK (1 << 6)
165#define ELF_SHDR_FLAGS_LINK_ORDER (1 << 7)
166#define ELF_SHDR_FLAGS_OS_NONCONFORMING (1 << 8)
167#define ELF_SHDR_FLAGS_GROUP (1 << 9)
168#define ELF_SHDR_FLAGS_TLS (1 << 10)
169#define ELF_SHDR_FLAGS_COMPRESSED (1 << 11)
170#define ELF_SHDR_FLAGS_MASKOS 0x0ff00000
171#define ELF_SHDR_FLAGS_MASKPROC 0xf0000000
172
173/* Special section indices */
174#define ELF_SHN_UNDEF 0
175#define ELF_SHN_LORESERVE 0xff00
176#define ELF_SHN_LOPROC 0xff00
177#define ELF_SHN_HIPROC 0xff1f
178#define ELF_SHN_LOOS 0xff20
179#define ELF_SHN_HIOS 0xff3f
180#define ELF_SHN_ABS 0xfff1
181#define ELF_SHN_COMMON 0xfff2
182#define ELF_SHN_XINDEX 0xffff
183#define ELF_SHN_HIRESERVE 0xffff
184
185/* Symbol table entry info */
186#define ELF_ST_BIND(info) ((info) >> 4)
187#define ELF_ST_TYPE(info) ((info) & 0xf)
188#define ELF_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
189
190/* Symbol binding */
191#define ELF_STB_LOCAL 0
192#define ELF_STB_GLOBAL 1
193#define ELF_STB_WEAK 2
194#define ELF_STB_LOOS 10
195#define ELF_STB_HIOS 12
196#define ELF_STB_LOPROC 13
197#define ELF_STB_HIPROC 15
198
199/* Symbol types */
200#define ELF_STT_NOTYPE 0
201#define ELF_STT_OBJECT 1
202#define ELF_STT_FUNC 2
203#define ELF_STT_SECTION 3
204#define ELF_STT_FILE 4
205#define ELF_STT_COMMON 5
206#define ELF_STT_TLS 6
207#define ELF_STT_LOOS 10
208#define ELF_STT_HIOS 12
209#define ELF_STT_LOPROC 13
210#define ELF_STT_HIPROC 15
211
212/* Dynamic entry tags */
213#define ELF_DT_NULL 0
214#define ELF_DT_NEEDED 1
215#define ELF_DT_PLTRELSZ 2
216#define ELF_DT_PLTGOT 3
217#define ELF_DT_HASH 4
218#define ELF_DT_STRTAB 5
219#define ELF_DT_SYMTAB 6
220#define ELF_DT_RELA 7
221#define ELF_DT_RELASZ 8
222#define ELF_DT_RELAENT 9
223#define ELF_DT_STRSZ 10
224#define ELF_DT_SYMENT 11
225#define ELF_DT_INIT 12
226#define ELF_DT_FINI 13
227#define ELF_DT_SONAME 14
228#define ELF_DT_RPATH 15
229#define ELF_DT_SYMBOLIC 16
230#define ELF_DT_REL 17
231#define ELF_DT_RELSZ 18
232#define ELF_DT_RELENT 19
233#define ELF_DT_PLTREL 20
234#define ELF_DT_DEBUG 21
235#define ELF_DT_TEXTREL 22
236#define ELF_DT_JMPREL 23
237#define ELF_DT_BIND_NOW 24
238#define ELF_DT_INIT_ARRAY 25
239#define ELF_DT_FINI_ARRAY 26
240#define ELF_DT_INIT_ARRAYSZ 27
241#define ELF_DT_FINI_ARRAYSZ 28
242#define ELF_DT_RUNPATH 29
243#define ELF_DT_FLAGS 30
244#define ELF_DT_ENCODING 32
245#define ELF_DT_PREINIT_ARRAY 32
246#define ELF_DT_PREINIT_ARRAYSZ 33
247#define ELF_DT_SYMTAB_SHNDX 34
248#define ELF_DT_LOW_OS 0x6000000d
249#define ELF_DT_HIGH_OS 0x6ffff000
250#define ELF_DT_LOW_PROC 0x70000000
251#define ELF_DT_HIGH_PROC 0x7fffffff
252
263#define ELF_IS_VALID(hdr) \
264 ((hdr)->ident[ELF_IDENT_MAG0] == ELF_MAG0 && (hdr)->ident[ELF_IDENT_MAG1] == ELF_MAG1 && \
265 (hdr)->ident[ELF_IDENT_MAG2] == ELF_MAG2 && (hdr)->ident[ELF_IDENT_MAG3] == ELF_MAG3 && \
266 (hdr)->ident[ELF_IDENT_CLASS] == ELF_CLASS_64 && (hdr)->ident[ELF_IDENT_DATA] == ELF_DATA_2LSB && \
267 (hdr)->ident[ELF_IDENT_VERSION] == ELF_VERSION_CURRENT && (hdr)->ident[ELF_IDENT_OSABI] == ELF_OSABI_SYSV && \
268 (hdr)->machine == ELF_HDR_MACHINE_X86_64 && (hdr)->version == ELF_HDR_VERSION_1)
269
292
309
328
343
355
361typedef struct
362{
365} elf_rel_t;
366
372typedef struct
373{
375 union {
378 } un;
379} elf_dyn_t;
380
392
393#endif
394
uint32_t elf_hdr_version_t
Definition elf.h:101
uint32_t elf_phdr_type_t
Definition elf.h:106
uint16_t elf_hdr_machine_t
Definition elf.h:78
uint32_t elf_shdr_type_t
Definition elf.h:132
uint32_t elf_phdr_flags_t
Definition elf.h:126
uint16_t elf_hdr_type_t
Definition elf.h:68
uint64_t elf_shdr_flags_t
Definition elf.h:158
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
__UINT16_TYPE__ uint16_t
Definition stdint.h:13
__INT64_TYPE__ int64_t
Definition stdint.h:16
ELF dynamic entry.
Definition elf.h:373
uint64_t ptr
Definition elf.h:377
uint64_t val
Definition elf.h:376
int64_t tag
Definition elf.h:374
ELF file header.
Definition elf.h:276
uint16_t shdrSize
Definition elf.h:288
uint16_t shdrStringIndex
Definition elf.h:290
uint16_t headerSize
Definition elf.h:285
elf_hdr_version_t version
Definition elf.h:280
elf_hdr_machine_t machine
Definition elf.h:279
uint16_t shdrAmount
Definition elf.h:289
uint64_t shdrOffset
Definition elf.h:283
uint16_t phdrAmount
Definition elf.h:287
uint64_t entry
Definition elf.h:281
uint64_t phdrOffset
Definition elf.h:282
uint32_t flags
Definition elf.h:284
uint16_t phdrSize
Definition elf.h:286
elf_hdr_type_t type
Definition elf.h:278
ELF note header.
Definition elf.h:387
uint32_t type
Definition elf.h:390
uint32_t descSize
Definition elf.h:389
uint32_t nameSize
Definition elf.h:388
ELF program header.
Definition elf.h:299
uint64_t fileSize
Definition elf.h:305
uint64_t offset
Definition elf.h:302
uint64_t memorySize
Definition elf.h:306
uint64_t virtAddr
Definition elf.h:303
elf_phdr_flags_t flags
Definition elf.h:301
elf_phdr_type_t type
Definition elf.h:300
uint64_t physAddr
Definition elf.h:304
uint64_t align
Definition elf.h:307
ELF relocation entry without addend.
Definition elf.h:362
uint64_t offset
Definition elf.h:363
uint64_t info
Definition elf.h:364
ELF relocation entry with addend.
Definition elf.h:350
uint64_t offset
Definition elf.h:351
int64_t addend
Definition elf.h:353
uint64_t info
Definition elf.h:352
ELF section header.
Definition elf.h:316
uint32_t name
Definition elf.h:317
uint32_t info
Definition elf.h:324
uint64_t size
Definition elf.h:322
elf_shdr_flags_t flags
Definition elf.h:319
uint64_t address
Definition elf.h:320
uint64_t offset
Definition elf.h:321
uint64_t addressAlign
Definition elf.h:325
uint32_t link
Definition elf.h:323
elf_shdr_type_t type
Definition elf.h:318
uint64_t entrySize
Definition elf.h:326
ELF symbol table entry.
Definition elf.h:335
uint16_t shndx
Definition elf.h:339
uint64_t value
Definition elf.h:340
uint8_t other
Definition elf.h:338
uint8_t info
Definition elf.h:337
uint32_t name
Definition elf.h:336
uint64_t size
Definition elf.h:341