From cfa68f2f409f58c831bf64a5687385f2188e8d86 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 13 Jun 2023 07:43:58 +0300 Subject: [PATCH] Initial symbol loading --- src/Core/PS4/Linker.cpp | 25 +++++++++++++++++++++++++ src/Core/PS4/Linker.h | 4 +++- src/Loader/Elf.h | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index 0d08e840..d506af9f 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -48,6 +48,7 @@ Module* Linker::LoadModule(const std::string& elf_name) { LoadModuleToMemory(m); LoadDynamicInfo(m); + LoadSymbols(m); } else { @@ -310,9 +311,33 @@ void Linker::LoadDynamicInfo(Module* m) //TODO? LOG_INFO_IF(debug_loader, "unsupported DT_SCE_MODULE_ATTR value = ..........: {:#018x}\n", dyn->d_un.d_val); break; + case DT_SCE_EXPORT_LIB: + { + LibraryInfo info{}; + info.value = dyn->d_un.d_val; + info.name = m->dynamic_info->str_table + info.name_offset; + m->dynamic_info->export_libs.push_back(info); + } + break; default: LOG_INFO_IF(debug_loader, "unsupported dynamic tag ..........: {:#018x}\n", dyn->d_tag); } } +} + +void Linker::LoadSymbols(Module* m) +{ + if (m->dynamic_info->symbol_table == nullptr || m->dynamic_info->str_table == nullptr || m->dynamic_info->symbol_table_total_size==0) + { + LOG_INFO_IF(debug_loader, "Symbol table not found!\n"); + return; + } + for (auto* sym = m->dynamic_info->symbol_table; + reinterpret_cast(sym) < reinterpret_cast(m->dynamic_info->symbol_table) + m->dynamic_info->symbol_table_total_size; + sym++) + { + std::string id = std::string(m->dynamic_info->str_table + sym->st_name); + LOG_INFO_IF(debug_loader, "symbol {}\n", id.c_str()); + } } \ No newline at end of file diff --git a/src/Core/PS4/Linker.h b/src/Core/PS4/Linker.h index 4b01a0c4..21f95de2 100644 --- a/src/Core/PS4/Linker.h +++ b/src/Core/PS4/Linker.h @@ -85,6 +85,7 @@ struct DynamicModuleInfo std::vector import_modules; std::vector export_modules; std::vector import_libs; + std::vector export_libs; std::string filename;//filename with absolute path @@ -99,7 +100,8 @@ public: Module* LoadModule(const std::string& elf_name); Module* FindModule(/*u32 id*/); void LoadModuleToMemory(Module* m); - void LoadDynamicInfo(Module* program); + void LoadDynamicInfo(Module* m); + void LoadSymbols(Module* m); private: std::vector m_modules; diff --git a/src/Loader/Elf.h b/src/Loader/Elf.h index 4c5686f4..b9159e67 100644 --- a/src/Loader/Elf.h +++ b/src/Loader/Elf.h @@ -343,6 +343,7 @@ constexpr s64 DT_SCE_ORIGINAL_FILENAME = 0x61000009; constexpr s64 DT_SCE_MODULE_INFO = 0x6100000d; constexpr s64 DT_SCE_NEEDED_MODULE = 0x6100000f; constexpr s64 DT_SCE_MODULE_ATTR = 0x61000011; +constexpr s64 DT_SCE_EXPORT_LIB = 0x61000013; constexpr s64 DT_SCE_IMPORT_LIB = 0x61000015; constexpr s64 DT_SCE_IMPORT_LIB_ATTR = 0x61000019; constexpr s64 DT_SCE_HASH = 0x61000025;