#pragma once #include "Loader.h" #include struct vfsStream; class rFile; namespace loader { namespace handlers { class elf64 : public handler { public: struct ehdr { be_t e_magic; u8 e_class; u8 e_data; u8 e_curver; u8 e_os_abi; be_t e_abi_ver; be_t e_type; be_t e_machine; be_t e_version; be_t e_entry; be_t e_phoff; be_t e_shoff; be_t e_flags; be_t e_ehsize; be_t e_phentsize; be_t e_phnum; be_t e_shentsize; be_t e_shnum; be_t e_shstrndx; bool check() const { return e_magic.data() == se32(0x7F454C46); } } m_ehdr; struct phdr { be_t p_type; be_t p_flags; be_t p_offset; bptr p_vaddr; bptr p_paddr; be_t p_filesz; be_t p_memsz; be_t p_align; }; struct shdr { be_t sh_name; be_t sh_type; be_t sh_flags; bptr sh_addr; be_t sh_offset; be_t sh_size; be_t sh_link; be_t sh_info; be_t sh_addralign; be_t sh_entsize; }; struct sprx_module_info { be_t attr; u8 version[2]; char name[28]; be_t toc_addr; be_t export_start; be_t export_end; be_t import_start; be_t import_end; } m_sprx_module_info; struct sprx_export_info { u8 size; u8 padding; be_t version; be_t attr; be_t func_count; be_t vars_count; be_t tls_vars_count; be_t hash_info; be_t tls_hash_info; u8 reserved[2]; be_t lib_name_offset; be_t nid_offset; be_t stub_offset; }; struct sprx_import_info { u8 size; u8 unused; be_t version; be_t attr; be_t func_count; be_t vars_count; be_t tls_vars_count; u8 reserved[4]; be_t lib_name_offset; be_t nid_offset; be_t stub_offset; //... }; struct sprx_function_info { be_t name_table_offset; be_t entry_table_offset; be_t padding; } m_sprx_function_info; struct sprx_lib_info { std::string name; }; struct sprx_segment_info { vm::ptr begin; u32 size; u32 size_file; vm::ptr initial_addr; std::vector modules; }; struct sprx_info { std::string name; u32 rtoc; struct module_info { std::unordered_map exports; std::unordered_map imports; }; std::unordered_map modules; std::vector segments; }; std::vector m_phdrs; std::vector m_shdrs; std::vector m_sprx_segments_info; std::vector m_sprx_import_info; std::vector m_sprx_export_info; public: virtual ~elf64() = default; error_code init(vfsStream& stream) override; error_code load() override; error_code load_data(u64 offset); error_code load_sprx(sprx_info& info); bool is_sprx() const { return m_ehdr.e_type == 0xffa4; } std::string sprx_get_module_name() const { return m_sprx_module_info.name; } }; } }