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#include <mos/vector.hpp>
11
18
19#if MOS_LITTLE_ENDIAN
20#define ELF_ENDIANNESS_MOS_DEFAULT ELF_ENDIANNESS_LSB
21#else
22#define ELF_ENDIANNESS_MOS_DEFAULT ELF_ENDIANNESS_MSB
23#endif
24
25typedef struct
26{
27 char magic[4];
28 u32 bits : 8;
35
36MOS_STATIC_ASSERT(sizeof(elf_identity_t) == 16, "elf_identity_t has wrong size");
37
60
61typedef enum
62{
63 ELF_PT_NULL = 0, // Unused entry
64 ELF_PT_LOAD = 1, // Loadable segment
65 ELF_PT_DYNAMIC = 2, // Dynamic linking information
66 ELF_PT_INTERP = 3, // Interpreter information
67 ELF_PT_NOTE = 4, // Auxiliary information
68 ELF_PT_SHLIB = 5, // reserved
69 ELF_PT_PHDR = 6, // Segment containing program header table
70 ELF_PT_TLS = 7, // Thread-local storage segment
71
73
74 ELF_PT_OS_LOW = 0x60000000, // reserved
75 ELF_PT_OS_HIGH = 0x6fffffff, // reserved
76 ELF_PT_PROCESSOR_LO = 0x70000000, // reserved
77 ELF_PT_PROCESSOR_HI = 0x7fffffff, // reserved
79
80typedef enum
81{
82 ELF_PF_X = 1 << 0, // Executable
83 ELF_PF_W = 1 << 1, // Writable
84 ELF_PF_R = 1 << 2, // Readable
86
87typedef struct elf_program_hdr_t
88{
90 elf_ph_flags __p_flags; // Segment independent flags (64-bit only)
91 ptr_t data_offset; // Offset of the segment in the file
92 ptr_t vaddr; // Virtual address of the segment
93 ptr_t _reserved; // reserved
94 ptr_t size_in_file; // Size of the segment in the file (may be 0)
95 ptr_t size_in_mem; // Size of the segment in memory (may be 0)
97
99 {
100 return __p_flags;
101 }
103
105{
110
111 void AddAuxvEntry(u64 type, u64 val)
112 {
113 auxv.push_back(Elf64_auxv_t{ .a_type = type, .a_un = { .a_val = val } });
114 }
115};
116
117[[nodiscard]] bool elf_read_and_verify_executable(FsBaseFile *file, elf_header_t *header);
118[[nodiscard]] bool elf_do_fill_process(Process *proc, FsBaseFile *file, elf_header_t elf, elf_startup_info_t *info);
Process * elf_create_process(mos::string_view path, Process *parent, const mos::vector< mos::string > &argv, const mos::vector< mos::string > &envp, const stdio_t *ios)
Definition elf.cpp:384
elf_program_header_type
Definition elf.hpp:62
@ ELF_PT_PROCESSOR_LO
Definition elf.hpp:76
@ ELF_PT_PHDR
Definition elf.hpp:69
@ ELF_PT_DYNAMIC
Definition elf.hpp:65
@ ELF_PT_LOAD
Definition elf.hpp:64
@ ELF_PT_OS_HIGH
Definition elf.hpp:75
@ _ELF_PT_COUNT
Definition elf.hpp:72
@ ELF_PT_OS_LOW
Definition elf.hpp:74
@ ELF_PT_PROCESSOR_HI
Definition elf.hpp:77
@ ELF_PT_NOTE
Definition elf.hpp:67
@ ELF_PT_SHLIB
Definition elf.hpp:68
@ ELF_PT_INTERP
Definition elf.hpp:66
@ ELF_PT_NULL
Definition elf.hpp:63
@ ELF_PT_TLS
Definition elf.hpp:70
elf_endianness
Definition elf.hpp:13
@ ELF_ENDIANNESS_INVALID
Definition elf.hpp:14
@ ELF_ENDIANNESS_MSB
Definition elf.hpp:16
@ ELF_ENDIANNESS_LSB
Definition elf.hpp:15
bool elf_do_fill_process(Process *proc, FsBaseFile *file, elf_header_t elf, elf_startup_info_t *info)
Definition elf.cpp:232
elf_ph_flags
Definition elf.hpp:81
@ ELF_PF_X
Definition elf.hpp:82
@ ELF_PF_W
Definition elf.hpp:83
@ ELF_PF_R
Definition elf.hpp:84
bool elf_read_and_verify_executable(FsBaseFile *file, elf_header_t *header)
Definition elf.cpp:347
#define __packed
Definition mos_global.h:29
#define MOS_STATIC_ASSERT
Definition mos_global.h:14
basic_string_view< char > string_view
elf_identity_t identity
Definition elf.hpp:40
int machine_type
Definition elf.hpp:42
u16 header_size
Definition elf.hpp:51
u32 version
Definition elf.hpp:44
int object_type
Definition elf.hpp:41
u16 count
Definition elf.hpp:55
u16 sh_strtab_index
Definition elf.hpp:58
size_t sh_offset
Definition elf.hpp:48
size_t ph_offset
Definition elf.hpp:47
u32 flags
Definition elf.hpp:50
ptr_t entry_point
Definition elf.hpp:46
u16 entry_size
Definition elf.hpp:55
char magic[4]
Definition elf.hpp:27
u8 __padding[7]
Definition elf.hpp:33
u32 version
Definition elf.hpp:30
u32 endianness
Definition elf.hpp:29
u8 abiversion
Definition elf.hpp:32
elf_program_header_type header_type
Definition elf.hpp:89
ptr_t size_in_mem
Definition elf.hpp:95
ptr_t required_alignment
Definition elf.hpp:96
Flags< elf_ph_flags > flags() const
Definition elf.hpp:98
ptr_t _reserved
Definition elf.hpp:93
elf_ph_flags __p_flags
Definition elf.hpp:90
ptr_t size_in_file
Definition elf.hpp:94
ptr_t data_offset
Definition elf.hpp:91
mos::vector< mos::string > envp
Definition elf.hpp:109
mos::string_view invocation
Definition elf.hpp:106
mos::vector< mos::string > argv
Definition elf.hpp:108
mos::vector< Elf64_auxv_t > auxv
Definition elf.hpp:107
void AddAuxvEntry(u64 type, u64 val)
Definition elf.hpp:111
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 long long u64
Definition types.h:19
unsigned char u8
Definition types.h:15