From cae39ccf23a68e6b68d6ffaffd02b572bac670aa Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 14 Jun 2023 07:47:44 +0300 Subject: [PATCH] encode id64 for modules,libraries --- src/Core/PS4/Linker.cpp | 28 ++++++++++++++++++++++++++++ src/Core/PS4/Linker.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index d506af9f..7ab8b00f 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -38,6 +38,30 @@ static u64 calculate_base_size(const elf_header* ehdr, const elf_program_header* return base_size; } +static std::string encodeId(u64 nVal) +{ + std::string enc; + const char pCodes[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-"; + if (nVal < 0x40u) + { + enc += pCodes[nVal]; + } + else + { + if (nVal < 0x1000u) + { + enc += pCodes[static_cast(nVal >> 6u) & 0x3fu]; + enc += pCodes[nVal & 0x3fu]; + } + else + { + enc += pCodes[static_cast(nVal >> 12u) & 0x3fu]; + enc += pCodes[static_cast(nVal >> 6u) & 0x3fu]; + enc += pCodes[nVal & 0x3fu]; + } + } + return enc; +} Module* Linker::LoadModule(const std::string& elf_name) { auto* m = new Module; @@ -275,6 +299,7 @@ void Linker::LoadDynamicInfo(Module* m) ModuleInfo info{}; info.value = dyn->d_un.d_val; info.name = m->dynamic_info->str_table + info.name_offset; + info.enc_id = encodeId(info.id); m->dynamic_info->import_modules.push_back(info); } break; @@ -283,6 +308,7 @@ void Linker::LoadDynamicInfo(Module* m) LibraryInfo info{}; info.value = dyn->d_un.d_val; info.name = m->dynamic_info->str_table + info.name_offset; + info.enc_id = encodeId(info.id); m->dynamic_info->import_libs.push_back(info); } break; @@ -304,6 +330,7 @@ void Linker::LoadDynamicInfo(Module* m) ModuleInfo info{}; info.value = dyn->d_un.d_val; info.name = m->dynamic_info->str_table + info.name_offset; + info.enc_id = encodeId(info.id); m->dynamic_info->export_modules.push_back(info); } break; @@ -316,6 +343,7 @@ void Linker::LoadDynamicInfo(Module* m) LibraryInfo info{}; info.value = dyn->d_un.d_val; info.name = m->dynamic_info->str_table + info.name_offset; + info.enc_id = encodeId(info.id); m->dynamic_info->export_libs.push_back(info); } break; diff --git a/src/Core/PS4/Linker.h b/src/Core/PS4/Linker.h index 21f95de2..edbc78f8 100644 --- a/src/Core/PS4/Linker.h +++ b/src/Core/PS4/Linker.h @@ -30,6 +30,7 @@ struct ModuleInfo u16 id; }; }; + std::string enc_id; }; struct LibraryInfo @@ -45,6 +46,7 @@ struct LibraryInfo u16 id; }; }; + std::string enc_id; }; struct DynamicModuleInfo