diff --git a/src/Core/Memory.cpp b/src/Core/Memory.cpp index 1420f0db..e71612e1 100644 --- a/src/Core/Memory.cpp +++ b/src/Core/Memory.cpp @@ -4,30 +4,6 @@ namespace Memory { - - static u64 get_aligned_size(const elf_program_header* phdr) - { - return (phdr->p_align != 0 ? (phdr->p_memsz + (phdr->p_align - 1)) & ~(phdr->p_align - 1) : phdr->p_memsz); - } - - static u64 calculate_base_size(const elf_header* ehdr, const elf_program_header* phdr) - { - u64 base_size = 0; - for (u16 i = 0; i < ehdr->e_phnum; i++) - { - if (phdr[i].p_memsz != 0 && (phdr[i].p_type == PT_LOAD || phdr[i].p_type == PT_SCE_RELRO)) - { - auto phdrh = phdr + i; - u64 last_addr = phdr[i].p_vaddr + get_aligned_size(phdrh); - if (last_addr > base_size) - { - base_size = last_addr; - } - } - } - return base_size; - } - namespace VirtualMemory { u64 memory_alloc(u64 address, u64 size) diff --git a/src/Core/Memory.h b/src/Core/Memory.h index 961415c5..0ec563ed 100644 --- a/src/Core/Memory.h +++ b/src/Core/Memory.h @@ -2,9 +2,6 @@ namespace Memory { - static u64 get_aligned_size(const elf_program_header* phdr); - static u64 calculate_base_size(const elf_header* ehdr, const elf_program_header* phdr); - namespace VirtualMemory { u64 memory_alloc(u64 address, u64 size); } diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index 98ce25a9..effe7b79 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -1,4 +1,5 @@ #include "Linker.h" +#include "../Memory.h" Linker::Linker() { @@ -8,12 +9,43 @@ Linker::~Linker() { } +static u64 get_aligned_size(const elf_program_header* phdr) +{ + return (phdr->p_align != 0 ? (phdr->p_memsz + (phdr->p_align - 1)) & ~(phdr->p_align - 1) : phdr->p_memsz); +} + +static u64 calculate_base_size(const elf_header* ehdr, const elf_program_header* phdr) +{ + u64 base_size = 0; + for (u16 i = 0; i < ehdr->e_phnum; i++) + { + if (phdr[i].p_memsz != 0 && (phdr[i].p_type == PT_LOAD || phdr[i].p_type == PT_SCE_RELRO)) + { + auto phdrh = phdr + i; + u64 last_addr = phdr[i].p_vaddr + get_aligned_size(phdrh); + if (last_addr > base_size) + { + base_size = last_addr; + } + } + } + return base_size; +} + Module* Linker::LoadModule(const std::string& elf_name) { auto* m = new Module; m->elf = new Elf; m->elf->Open(elf_name);//load elf - + + if (m->elf->isElfFile()) + { + LoadModuleToMemory(m); + } + else + { + return nullptr;//it is not a valid elf file //TODO check it why! + } m_modules.push_back(m);//added it to load modules return m; @@ -29,4 +61,16 @@ Module* Linker::FindModule(/*u32 id*/) return m; } return nullptr; +} + +void Linker::LoadModuleToMemory(Module* m) +{ + //get elf header, program header + auto* elf_header = m->elf->GetElfHeader(); + auto* elf_pheader = m->elf->GetProgramHeader(); + + u64 base_size = calculate_base_size(elf_header,elf_pheader); + m->aligned_base_size = (base_size & ~(static_cast(0x1000) - 1)) + 0x1000;//align base size to 0x1000 block size (TODO is that the default block size or it can be changed? + + } \ No newline at end of file diff --git a/src/Core/PS4/Linker.h b/src/Core/PS4/Linker.h index 7a098489..7f51bc1a 100644 --- a/src/Core/PS4/Linker.h +++ b/src/Core/PS4/Linker.h @@ -6,6 +6,8 @@ struct Module { Elf* elf = nullptr; + u64 aligned_base_size = 0; + u64 base_virtual_addr = 0; //base virtual address }; class Linker @@ -16,6 +18,7 @@ public: Module* LoadModule(const std::string& elf_name); Module* FindModule(/*u32 id*/); + void LoadModuleToMemory(Module* m); private: std::vector m_modules;