PatchworkOS  966e257
A non-POSIX operating system.
Loading...
Searching...
No Matches
elf64_load_segments.c
Go to the documentation of this file.
1#include "common/elf.h"
2
3void elf64_load_segments(const Elf64_File* elf, Elf64_Addr base, Elf64_Off offset)
4{
5 if (elf == NULL)
6 {
7 return;
8 }
9
10 Elf64_Ehdr* header = (Elf64_Ehdr*)elf->header;
11 for (uint32_t i = 0; i < header->e_phnum; i++)
12 {
13 Elf64_Phdr* phdr = ELF64_GET_PHDR(elf, i);
14 if (phdr->p_type != PT_LOAD)
15 {
16 continue;
17 }
18
19 void* dest = (void*)(base + (phdr->p_vaddr - offset));
20 void* src = ELF64_AT_OFFSET(elf, phdr->p_offset);
21 elf_memcpy(dest, src, phdr->p_filesz);
22 if (phdr->p_memsz > phdr->p_filesz)
23 {
24 elf_memset((void*)((uintptr_t)dest + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz);
25 }
26 }
27}
#define ELF64_AT_OFFSET(elf, offset)
Get a pointer to a location in the ELF file at the given offset.
Definition elf.h:814
#define ELF64_GET_PHDR(elf, index)
Get the program header at the given index from an ELF file.
Definition elf.h:795
void elf64_load_segments(const Elf64_File *elf, Elf64_Addr base, Elf64_Off offset)
Load all loadable segments of an ELF file into memory.
uint64_t Elf64_Off
ELF64 Unsigned file offset.
Definition elf.h:36
uint64_t Elf64_Addr
ELF64 Unsigned program address.
Definition elf.h:30
@ PT_LOAD
Loadable segment.
Definition elf.h:748
#define NULL
Pointer error value.
Definition NULL.h:23
#define elf_memcpy
Definition elf.h:35
#define elf_memset
Definition elf.h:36
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:43
ELF64 Header.
Definition elf.h:95
Elf64_Half e_phnum
Number of entries in the program header table.
Definition elf.h:106
ELF File Helper structure.
Definition elf.h:781
Elf64_Ehdr * header
The data in the file, pointed to the start of the ELF header.
Definition elf.h:782
ELF64 Program Header.
Definition elf.h:730
Elf64_Xword p_memsz
Size of segment in memory in bytes.
Definition elf.h:737
Elf64_Addr p_vaddr
Target virtual address in memory.
Definition elf.h:734
Elf64_Off p_offset
Segment file offset in bytes.
Definition elf.h:733
Elf64_Word p_type
Segment type.
Definition elf.h:731
Elf64_Xword p_filesz
Size of segment in file in bytes.
Definition elf.h:736