diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index 5f6c3acc..7d2d65ee 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -109,6 +109,30 @@ void Linker::LoadModuleToMemory(Module* m) LOG_ERROR_IF(debug_loader, "p_memsz==0 in type {}\n", m->elf->ElfPheaderTypeStr(elf_pheader[i].p_type)); } break; + case PT_DYNAMIC: + if (elf_pheader[i].p_filesz != 0) + { + void* dynamic = new u08[elf_pheader[i].p_filesz]; + m->elf->LoadSegment(reinterpret_cast(dynamic), elf_pheader[i].p_offset, elf_pheader[i].p_filesz); + m->m_dynamic = dynamic; + } + else + { + LOG_ERROR_IF(debug_loader, "p_filesz==0 in type {}\n", m->elf->ElfPheaderTypeStr(elf_pheader[i].p_type)); + } + break; + case PT_SCE_DYNLIBDATA: + if (elf_pheader[i].p_filesz != 0) + { + void* dynamic = new u08[elf_pheader[i].p_filesz]; + m->elf->LoadSegment(reinterpret_cast(dynamic), elf_pheader[i].p_offset, elf_pheader[i].p_filesz); + m->m_dynamic_data = dynamic; + } + else + { + LOG_ERROR_IF(debug_loader, "p_filesz==0 in type {}\n", m->elf->ElfPheaderTypeStr(elf_pheader[i].p_type)); + } + break; default: LOG_ERROR_IF(debug_loader, "Unimplemented type {}\n", m->elf->ElfPheaderTypeStr(elf_pheader[i].p_type)); } diff --git a/src/Core/PS4/Linker.h b/src/Core/PS4/Linker.h index 7f51bc1a..002dc30f 100644 --- a/src/Core/PS4/Linker.h +++ b/src/Core/PS4/Linker.h @@ -8,6 +8,9 @@ struct Module Elf* elf = nullptr; u64 aligned_base_size = 0; u64 base_virtual_addr = 0; //base virtual address + + void* m_dynamic = nullptr; + void* m_dynamic_data = nullptr; }; class Linker