MOS Source Code
Loading...
Searching...
No Matches
elf.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
7
8#include <elf.h>
9#include <mos/types.hpp>
10
17
18#if MOS_LITTLE_ENDIAN
19#define ELF_ENDIANNESS_MOS_DEFAULT ELF_ENDIANNESS_LSB
20#else
21#define ELF_ENDIANNESS_MOS_DEFAULT ELF_ENDIANNESS_MSB
22#endif
23
24typedef struct
25{
26 char magic[4];
27 u32 bits : 8;
34
35MOS_STATIC_ASSERT(sizeof(elf_identity_t) == 16, "elf_identity_t has wrong size");
36
59
60typedef enum
61{
62 ELF_PT_NULL = 0, // Unused entry
63 ELF_PT_LOAD = 1, // Loadable segment
64 ELF_PT_DYNAMIC = 2, // Dynamic linking information
65 ELF_PT_INTERP = 3, // Interpreter information
66 ELF_PT_NOTE = 4, // Auxiliary information
67 ELF_PT_SHLIB = 5, // reserved
68 ELF_PT_PHDR = 6, // Segment containing program header table
69 ELF_PT_TLS = 7, // Thread-local storage segment
70
72
73 ELF_PT_OS_LOW = 0x60000000, // reserved
74 ELF_PT_OS_HIGH = 0x6fffffff, // reserved
75 ELF_PT_PROCESSOR_LO = 0x70000000, // reserved
76 ELF_PT_PROCESSOR_HI = 0x7fffffff, // reserved
78
79typedef enum
80{
81 ELF_PF_X = 1 << 0, // Executable
82 ELF_PF_W = 1 << 1, // Writable
83 ELF_PF_R = 1 << 2, // Readable
85
86typedef struct
87{
89 elf_ph_flags p_flags; // Segment independent flags (64-bit only)
90 ptr_t data_offset; // Offset of the segment in the file
91 ptr_t vaddr; // Virtual address of the segment
92 ptr_t _reserved; // reserved
93 ptr_t size_in_file; // Size of the segment in the file (may be 0)
94 ptr_t size_in_mem; // Size of the segment in memory (may be 0)
97
98#define AUXV_VEC_SIZE 16
99
100typedef struct
101{
102 int count = 0;
103 Elf64_auxv_t vector[AUXV_VEC_SIZE] = {};
104} auxv_vec_t;
105
106typedef struct
107{
108 const char *invocation;
110 int argc;
111 const char **argv;
112
113 int envc;
114 const char **envp;
116
118__nodiscard bool elf_fill_process(Process *proc, file_t *file, const char *path, const char *const argv[], const char *const envp[]);
120Process *elf_create_process(const char *path, Process *parent, const char *const argv[], const char *const envp[], const stdio_t *ios);
elf_program_header_type
Definition elf.hpp:61
@ ELF_PT_PROCESSOR_LO
Definition elf.hpp:75
@ ELF_PT_PHDR
Definition elf.hpp:68
@ ELF_PT_DYNAMIC
Definition elf.hpp:64
@ ELF_PT_LOAD
Definition elf.hpp:63
@ ELF_PT_OS_HIGH
Definition elf.hpp:74
@ _ELF_PT_COUNT
Definition elf.hpp:71
@ ELF_PT_OS_LOW
Definition elf.hpp:73
@ ELF_PT_PROCESSOR_HI
Definition elf.hpp:76
@ ELF_PT_NOTE
Definition elf.hpp:66
@ ELF_PT_SHLIB
Definition elf.hpp:67
@ ELF_PT_INTERP
Definition elf.hpp:65
@ ELF_PT_NULL
Definition elf.hpp:62
@ ELF_PT_TLS
Definition elf.hpp:69
elf_endianness
Definition elf.hpp:12
@ ELF_ENDIANNESS_INVALID
Definition elf.hpp:13
@ ELF_ENDIANNESS_MSB
Definition elf.hpp:15
@ ELF_ENDIANNESS_LSB
Definition elf.hpp:14
Process * elf_create_process(const char *path, Process *parent, const char *const argv[], const char *const envp[], const stdio_t *ios)
Definition elf.cpp:420
__nodiscard bool elf_read_and_verify_executable(file_t *file, elf_header_t *header)
Definition elf.cpp:351
__nodiscard bool elf_fill_process(Process *proc, file_t *file, const char *path, const char *const argv[], const char *const envp[])
Definition elf.cpp:366
elf_ph_flags
Definition elf.hpp:80
@ ELF_PF_X
Definition elf.hpp:81
@ ELF_PF_W
Definition elf.hpp:82
@ ELF_PF_R
Definition elf.hpp:83
__nodiscard bool elf_do_fill_process(Process *proc, file_t *file, elf_header_t elf, elf_startup_info_t *info)
Definition elf.cpp:243
#define AUXV_VEC_SIZE
Definition elf.hpp:98
const char ** argv
Definition kmain.cpp:34
#define __packed
Definition mos_global.h:29
#define __nodiscard
Definition mos_global.h:35
#define MOS_STATIC_ASSERT
Definition mos_global.h:14
Elf64_auxv_t vector[16]
Definition elf.hpp:103
int count
Definition elf.hpp:102
elf_identity_t identity
Definition elf.hpp:39
int machine_type
Definition elf.hpp:41
u16 header_size
Definition elf.hpp:50
u32 version
Definition elf.hpp:43
int object_type
Definition elf.hpp:40
u16 count
Definition elf.hpp:54
u16 sh_strtab_index
Definition elf.hpp:57
size_t sh_offset
Definition elf.hpp:47
size_t ph_offset
Definition elf.hpp:46
u32 flags
Definition elf.hpp:49
ptr_t entry_point
Definition elf.hpp:45
u16 entry_size
Definition elf.hpp:54
char magic[4]
Definition elf.hpp:26
u8 __padding[7]
Definition elf.hpp:32
u32 version
Definition elf.hpp:29
u32 endianness
Definition elf.hpp:28
u8 abiversion
Definition elf.hpp:31
elf_program_header_type header_type
Definition elf.hpp:88
ptr_t size_in_mem
Definition elf.hpp:94
elf_ph_flags p_flags
Definition elf.hpp:89
ptr_t required_alignment
Definition elf.hpp:95
ptr_t _reserved
Definition elf.hpp:92
ptr_t size_in_file
Definition elf.hpp:93
ptr_t data_offset
Definition elf.hpp:90
auxv_vec_t auxv
Definition elf.hpp:109
const char ** envp
Definition elf.hpp:114
const char ** argv
Definition elf.hpp:111
const char * invocation
Definition elf.hpp:108
A wrapper type for the standard I/O streams.
Definition process.hpp:17
unsigned int u32
Definition types.h:17
unsigned short u16
Definition types.h:16
unsigned long ptr_t
Definition types.h:21
unsigned char u8
Definition types.h:15