From bcc6288e9e61c4cb274bd1d869e653a93ee3b877 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 13 Jun 2023 19:05:06 +0300 Subject: [PATCH] supporting self segments loading --- src/Loader/Elf.cpp | 24 ++++++++++++++++++++++-- src/Loader/Elf.h | 26 +++++++++++++++++++++++++- src/main.cpp | 2 +- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/Loader/Elf.cpp b/src/Loader/Elf.cpp index 357e3b07..aa88c201 100644 --- a/src/Loader/Elf.cpp +++ b/src/Loader/Elf.cpp @@ -5,6 +5,9 @@ #include #include #include +#include "../Util/Log.h" + +constexpr bool debug_elf = true; template <> struct magic_enum::customize::enum_range { @@ -515,8 +518,25 @@ void Elf::LoadSegment(u64 virtual_addr, u64 file_offset, u64 size) { if (m_self!=nullptr) { - //it is self file //TODO - __debugbreak(); + for (uint16_t i = 0; i < m_self->segment_count; i++) + { + const auto& seg = m_self_segments[i]; + + if (seg.IsBlocked()) + { + auto phdr_id = seg.GetId(); + const auto& phdr = m_elf_phdr[phdr_id]; + + if (file_offset >= phdr.p_offset && file_offset < phdr.p_offset + phdr.p_filesz) + { + auto offset = file_offset - phdr.p_offset; + m_f->Seek(offset + seg.file_offset,fsSeekMode::fsSeekSet); + m_f->Read(reinterpret_cast(static_cast(virtual_addr)), size); + return; + } + } + } + __debugbreak();//hmm we didn't return something... } else { diff --git a/src/Loader/Elf.h b/src/Loader/Elf.h index b9159e67..d13e3e1d 100644 --- a/src/Loader/Elf.h +++ b/src/Loader/Elf.h @@ -27,10 +27,34 @@ struct self_header struct self_segment_header { + bool IsBlocked() const { + return (flags & 0x800) != 0;//0 or 0x800 + } + + u32 GetId() const { + return (flags >> 20u) & 0xFFFu; + } + + bool IsOrdered() const { + return (flags & 1) != 0;//0 or 1 + } + + bool IsEncrypted() const { + return (flags & 2) != 0;//0 or 2 + } + + bool IsSigned() const { + return (flags & 4) != 0;//0 or 4 + } + + bool IsCompressed() const { + return (flags & 8) != 0;//0 or 8 + } + u64 flags; u64 file_offset; u64 file_size; - u64 memory_size; + u64 memory_size; }; diff --git a/src/main.cpp b/src/main.cpp index d59efd18..4dc12208 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,7 +36,7 @@ int main(int argc, char* argv[]) logging::init(true);//init logging - const char* const path = "videoout_basic.elf";// argv[1]; //argument 1 is the path of self file to boot + const char* const path = argv[1]; //argument 1 is the path of self file to boot auto* linker = Singleton::Instance(); auto *module =linker->LoadModule(path);//load main executable