From a2fe62bd7d0a04b9ce17c49268377001d898c77c Mon Sep 17 00:00:00 2001 From: DH Date: Sat, 1 Jul 2023 15:32:16 +0300 Subject: [PATCH] [rpcsx-os/linker] Do not load same prx twice --- rpcsx-os/linker.cpp | 54 ++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/rpcsx-os/linker.cpp b/rpcsx-os/linker.cpp index 3fb984b5b..1c4869a2d 100644 --- a/rpcsx-os/linker.cpp +++ b/rpcsx-os/linker.cpp @@ -375,8 +375,7 @@ Ref rx::linker::loadModule(std::span image, auto imageBase = reinterpret_cast( rx::vm::map(reinterpret_cast(baseAddress), - utils::alignUp(imageSize, rx::vm::kPageSize), - 0, + utils::alignUp(imageSize, rx::vm::kPageSize), 0, rx::vm::kMapFlagPrivate | rx::vm::kMapFlagAnonymous)); if (imageBase == MAP_FAILED) { @@ -562,15 +561,27 @@ Ref rx::linker::loadModule(std::span image, if (dyn.d_tag == kElfDynamicTypeNeeded) { auto name = std::string_view( sceStrtab + static_cast(dyn.d_un.d_val)); - if (name == "libSceFreeTypeOptBm-PRX.prx") { - // TODO - } else if (name.ends_with(".prx")) { - result->needed.push_back(std::string(name)); - } else if (name == "STREQUAL") { + if (name == "STREQUAL") { // HACK for broken FWs - result->needed.push_back("libSceDolbyVision.prx"); + result->needed.push_back("libSceDolbyVision"); } else { - std::fprintf(stderr, "Ignoring needed '%s'\n", name.data()); + if (name.ends_with(".prx")) { + name.remove_suffix(4); + } + if (name.ends_with("-PRX")) { + name.remove_suffix(4); // TODO: implement lib scan + } + if (name.ends_with("-module")) { + name.remove_suffix(7); // TODO: implement lib scan + } + if (name.ends_with("_padebug")) { + name.remove_suffix(8); + } + + if (name != "libSceFreeTypeOptBm") { // TODO + result->needed.push_back(std::string(name)); + result->needed.back() += ".prx"; + } } } @@ -825,15 +836,17 @@ Ref rx::linker::loadModuleFile(const char *path, static Ref createSceFreeTypeFull(orbis::Process *process) { auto result = orbis::create(); - std::strncpy(result->soName, "libSceFreeTypeFull-PRX.prx", sizeof(result->soName) - 1); - std::strncpy(result->moduleName, "libSceFreeType", sizeof(result->moduleName) - 1); + std::strncpy(result->soName, "libSceFreeTypeFull-PRX.prx", + sizeof(result->soName) - 1); + std::strncpy(result->moduleName, "libSceFreeType", + sizeof(result->moduleName) - 1); - result->neededLibraries.push_back({ - .name = "libSceFreeType", - .isExport = true - }); + result->neededLibraries.push_back( + {.name = "libSceFreeType", .isExport = true}); - for (auto dep : { "libSceFreeTypeSubFunc", "libSceFreeTypeOl", "libSceFreeTypeOt", "libSceFreeTypeOptOl", "libSceFreeTypeHinter" }) { + for (auto dep : + {"libSceFreeTypeSubFunc", "libSceFreeTypeOl", "libSceFreeTypeOt", + "libSceFreeTypeOptOl", "libSceFreeTypeHinter"}) { result->needed.push_back(dep); result->needed.back() += "-PRX.prx"; } @@ -842,7 +855,8 @@ static Ref createSceFreeTypeFull(orbis::Process *process) { auto neededMod = rx::linker::loadModuleByName(needed, process); if (neededMod == nullptr) { - std::fprintf(stderr, "Failed to load needed '%s' for FreeType\n", needed.c_str()); + std::fprintf(stderr, "Failed to load needed '%s' for FreeType\n", + needed.c_str()); std::abort(); } @@ -864,12 +878,6 @@ Ref rx::linker::loadModuleByName(std::string_view name, if (name.ends_with(".prx")) { name.remove_suffix(4); } - if (name.ends_with("-PRX")) { - name.remove_suffix(4); // TODO: implement lib scan - } - if (name.ends_with("-module")) { - name.remove_suffix(7); // TODO: implement lib scan - } if (auto it = g_moduleOverrideTable.find(name); it != g_moduleOverrideTable.end()) {