linker: Fix TLS for dynamic modules

* Technically not fully accurate but it works. TlsGetAddr should handle dynamic allocation of TLS blocks
This commit is contained in:
IndecisiveTurtle 2024-06-21 19:02:49 +03:00 committed by georgemoralis
parent 2506a285f4
commit 30351ad112
3 changed files with 7 additions and 4 deletions

View File

@ -177,7 +177,7 @@ s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, size_t arg
// Load PRX module and relocate any modules that import it.
auto* linker = Common::Singleton<Core::Linker>::Instance();
u32 handle = linker->LoadModule(path);
u32 handle = linker->LoadModule(path, true);
if (handle == -1) {
return ORBIS_KERNEL_ERROR_EINVAL;
}

View File

@ -96,7 +96,7 @@ void Linker::Execute() {
}
}
s32 Linker::LoadModule(const std::filesystem::path& elf_name) {
s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) {
std::scoped_lock lk{mutex};
if (!std::filesystem::exists(elf_name)) {
@ -110,6 +110,7 @@ s32 Linker::LoadModule(const std::filesystem::path& elf_name) {
return -1;
}
num_static_modules += !is_dynamic;
m_modules.emplace_back(std::move(module));
return m_modules.size() - 1;
}
@ -349,7 +350,8 @@ void Linker::InitTlsForThread(bool is_primary) {
dtv_table[1].counter = num_dtvs;
// Copy init images to TLS thread blocks and map them to DTV slots.
for (const auto& module : m_modules) {
for (u32 i = 0; i < num_static_modules; i++) {
auto* module = m_modules[i].get();
if (module->tls.image_size == 0) {
continue;
}

View File

@ -86,7 +86,7 @@ public:
void* TlsGetAddr(u64 module_index, u64 offset);
void InitTlsForThread(bool is_primary = false);
s32 LoadModule(const std::filesystem::path& elf_name);
s32 LoadModule(const std::filesystem::path& elf_name, bool is_dynamic = false);
Module* FindByAddress(VAddr address);
void Relocate(Module* module);
@ -103,6 +103,7 @@ private:
u32 dtv_generation_counter{1};
size_t static_tls_size{};
u32 max_tls_index{};
u32 num_static_modules{};
HeapApiFunc heap_api_func{};
std::vector<std::unique_ptr<Module>> m_modules;
Loader::SymbolsResolver m_hle_symbols{};