From cc471a85350845782c4aa97b008e4c3d7078a9c7 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 25 May 2023 18:08:10 +0300 Subject: [PATCH] segments loading (only elf atm) --- src/Core/PS4/Linker.cpp | 3 +++ src/Loader/Elf.cpp | 18 ++++++++++++++++++ src/Loader/Elf.h | 2 ++ 3 files changed, 23 insertions(+) diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index 3bda089d..5f6c3acc 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -101,6 +101,8 @@ void Linker::LoadModuleToMemory(Module* m) LOG_INFO_IF(debug_loader, "segment_file_size .....: {}\n", segment_file_size); LOG_INFO_IF(debug_loader, "segment_memory_size ...: {}\n", segment_memory_size); LOG_INFO_IF(debug_loader, "segment_mode ..........: {}\n", segment_mode); + + m->elf->LoadSegment(segment_addr, elf_pheader[i].p_offset, segment_file_size); } else { @@ -111,4 +113,5 @@ void Linker::LoadModuleToMemory(Module* m) LOG_ERROR_IF(debug_loader, "Unimplemented type {}\n", m->elf->ElfPheaderTypeStr(elf_pheader[i].p_type)); } } + LOG_INFO_IF(debug_loader, "program entry addr ..........: {:#018x}\n", m->elf->GetElfEntry() + m->base_virtual_addr); } \ No newline at end of file diff --git a/src/Loader/Elf.cpp b/src/Loader/Elf.cpp index 9a717dbb..be8a83fb 100644 --- a/src/Loader/Elf.cpp +++ b/src/Loader/Elf.cpp @@ -511,3 +511,21 @@ std::string Elf::ElfPHeaderStr(u16 no) header += fmt::format("p_align ...: {:#018x}\n", (m_elf_phdr + no)->p_align); return header; } +void Elf::LoadSegment(u64 virtual_addr, u64 file_offset, u64 size) +{ + if (m_self!=nullptr) + { + //it is self file //TODO + __debugbreak(); + } + else + { + //it's elf file + m_f->Seek(file_offset, fsSeekMode::fsSeekSet); + m_f->Read(reinterpret_cast(static_cast(virtual_addr)), size); + } +} +u64 Elf::GetElfEntry() +{ + return m_elf_header->e_entry; +} \ No newline at end of file diff --git a/src/Loader/Elf.h b/src/Loader/Elf.h index 4be4ed01..e842fbb6 100644 --- a/src/Loader/Elf.h +++ b/src/Loader/Elf.h @@ -343,6 +343,8 @@ public: std::string ElfPHeaderStr(u16 no); std::string ElfPheaderTypeStr(u32 type); std::string ElfPheaderFlagsStr(u32 flags); + void LoadSegment(u64 virtual_addr, u64 file_offset, u64 size); + u64 GetElfEntry(); private: