From 0fe6ad11f47ef84e1034310a152e8ce0f6f8fc1a Mon Sep 17 00:00:00 2001 From: boykopovar Date: Tue, 4 Aug 2026 01:24:23 +0300 Subject: [PATCH] refactor(core): remove extra targets and cmake lists --- CMakeLists.txt | 5 +-- core/CMakeLists.txt | 21 +++++++++ core/domain/CMakeLists.txt | 2 - core/elfpatcher/CMakeLists.txt | 5 --- core/io/CMakeLists.txt | 6 --- core/{relinker/src => }/main.cpp | 43 ++++++++++++++----- core/relinker/CMakeLists.txt | 18 -------- .../relinker/analysis/SyscallScanner.hpp | 1 + .../relinker/pipeline/RelinkerPipeline.hpp | 5 +-- core/relinker/src/analysis/SyscallScanner.cpp | 13 ++++++ .../src/pipeline/RelinkerPipeline.cpp | 4 +- 11 files changed, 70 insertions(+), 53 deletions(-) create mode 100644 core/CMakeLists.txt delete mode 100644 core/domain/CMakeLists.txt delete mode 100644 core/elfpatcher/CMakeLists.txt delete mode 100644 core/io/CMakeLists.txt rename core/{relinker/src => }/main.cpp (65%) delete mode 100644 core/relinker/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f3609d0a..df3672be0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,4 @@ project(Relinker CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -add_subdirectory(core/domain) -add_subdirectory(core/elfpatcher) -add_subdirectory(core/io) -add_subdirectory(core/relinker) +add_subdirectory(core) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt new file mode 100644 index 000000000..f916312af --- /dev/null +++ b/core/CMakeLists.txt @@ -0,0 +1,21 @@ +add_executable(relinker + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/elfpatcher/src/ElfPatcher.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/io/src/FileReader.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/io/src/FileWriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/parsing/ElfReader.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/parsing/SceDynlibParser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/parsing/SdkRevisionProfile.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/analysis/SyscallScanner.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/analysis/CallSiteResolver.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/analysis/ValidationPolicy.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/output/SysVDynamicSectionBuilder.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/output/CallRegistryWriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/src/pipeline/RelinkerPipeline.cpp +) +target_include_directories(relinker PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/domain/include + ${CMAKE_CURRENT_SOURCE_DIR}/elfpatcher/include + ${CMAKE_CURRENT_SOURCE_DIR}/io/include + ${CMAKE_CURRENT_SOURCE_DIR}/relinker/include +) diff --git a/core/domain/CMakeLists.txt b/core/domain/CMakeLists.txt deleted file mode 100644 index f1fc44ad5..000000000 --- a/core/domain/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_library(domain INTERFACE) -target_include_directories(domain INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/core/elfpatcher/CMakeLists.txt b/core/elfpatcher/CMakeLists.txt deleted file mode 100644 index 9cd97f8ae..000000000 --- a/core/elfpatcher/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -add_library(elfpatcher STATIC - ${CMAKE_CURRENT_SOURCE_DIR}/src/ElfPatcher.cpp -) -target_include_directories(elfpatcher PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_link_libraries(elfpatcher PRIVATE domain) diff --git a/core/io/CMakeLists.txt b/core/io/CMakeLists.txt deleted file mode 100644 index 776bcedc4..000000000 --- a/core/io/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -add_library(io STATIC - ${CMAKE_CURRENT_SOURCE_DIR}/src/FileReader.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/FileWriter.cpp -) -target_include_directories(io PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_link_libraries(io PRIVATE domain) diff --git a/core/relinker/src/main.cpp b/core/main.cpp similarity index 65% rename from core/relinker/src/main.cpp rename to core/main.cpp index e003b175b..6ddb34387 100644 --- a/core/relinker/src/main.cpp +++ b/core/main.cpp @@ -13,16 +13,32 @@ #include #include #include +#include +#include int main(const int argc, char* argv[]) { - if (argc < 4) { - std::cerr << "Usage: relinker \n"; - return 1; + bool skipSyscallCheck = false; + std::string inputPath; + std::string outputElfPath; + std::optional registryPath; + + for (int i = 1; i < argc; ++i) { + const std::string arg = argv[i]; + if (arg == "--skip-syscall-check") { + skipSyscallCheck = true; + } else if (inputPath.empty()) { + inputPath = arg; + } else if (outputElfPath.empty()) { + outputElfPath = arg; + } else if (!registryPath.has_value()) { + registryPath = arg; + } } - const std::string inputPath = argv[1]; - const std::string registryPath = argv[2]; - const std::string outputElfPath = argv[3]; + if (inputPath.empty() || outputElfPath.empty()) { + std::cerr << "Usage: relinker [--skip-syscall-check] [output_registry.json]\n"; + return 1; + } try { Io::FileReader fileReader; @@ -40,20 +56,25 @@ int main(const int argc, char* argv[]) { auto sdkProfile = std::make_shared(sceDynlibData); + auto syscallScanner = skipSyscallCheck + ? Relinker::MakeNullSyscallScanner() + : Relinker::MakeSyscallScanner(); + const auto pipeline = std::make_shared( elfReader, std::make_shared(sdkProfile), - Relinker::MakeSyscallScanner(), + std::move(syscallScanner), Relinker::MakeCallSiteResolver(), std::make_shared(), - std::make_shared(), - std::make_shared() + std::make_shared() ); auto result = pipeline->Relink(sourceBytes); - auto callRegistryWriter = std::make_shared(); - fileWriter.Write(registryPath, callRegistryWriter->WriteCallRegistry(result.RegistryEntries)); + if (registryPath.has_value()) { + auto callRegistryWriter = std::make_shared(); + fileWriter.Write(*registryPath, callRegistryWriter->WriteCallRegistry(result.RegistryEntries)); + } Elfpatcher::ElfPatcher elfPatcher; auto patchedElf = elfPatcher.Patch(sourceBytes, result.OriginalHeaders, result.DynamicSection); diff --git a/core/relinker/CMakeLists.txt b/core/relinker/CMakeLists.txt deleted file mode 100644 index c3f8e8c49..000000000 --- a/core/relinker/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -set(RELINKER_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) - -set(RELINKER_SOURCES - ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/parsing/ElfReader.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/parsing/SceDynlibParser.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/parsing/SdkRevisionProfile.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/analysis/SyscallScanner.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/analysis/CallSiteResolver.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/analysis/ValidationPolicy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/output/SysVDynamicSectionBuilder.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/output/CallRegistryWriter.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/pipeline/RelinkerPipeline.cpp -) - -add_executable(relinker ${RELINKER_SOURCES}) -target_include_directories(relinker PRIVATE ${RELINKER_INCLUDE_DIR}) -target_link_libraries(relinker PRIVATE domain elfpatcher io) diff --git a/core/relinker/include/relinker/analysis/SyscallScanner.hpp b/core/relinker/include/relinker/analysis/SyscallScanner.hpp index aa8850a7b..2e4551de7 100644 --- a/core/relinker/include/relinker/analysis/SyscallScanner.hpp +++ b/core/relinker/include/relinker/analysis/SyscallScanner.hpp @@ -7,6 +7,7 @@ namespace Relinker { std::unique_ptr MakeSyscallScanner(); +std::unique_ptr MakeNullSyscallScanner(); } diff --git a/core/relinker/include/relinker/pipeline/RelinkerPipeline.hpp b/core/relinker/include/relinker/pipeline/RelinkerPipeline.hpp index b29f9c4f5..20f5591a4 100644 --- a/core/relinker/include/relinker/pipeline/RelinkerPipeline.hpp +++ b/core/relinker/include/relinker/pipeline/RelinkerPipeline.hpp @@ -9,7 +9,6 @@ #include #include #include -#include #include namespace Relinker { @@ -22,8 +21,7 @@ public: std::shared_ptr syscallScanner, std::shared_ptr callSiteResolver, std::shared_ptr validationPolicy, - std::shared_ptr dynamicSectionBuilder, - std::shared_ptr callRegistryWriter + std::shared_ptr dynamicSectionBuilder ); RelinkResult Relink(const std::vector& sourceElf) override; @@ -35,7 +33,6 @@ private: std::shared_ptr _callSiteResolver; std::shared_ptr _validationPolicy; std::shared_ptr _dynamicSectionBuilder; - std::shared_ptr _callRegistryWriter; static constexpr std::uint32_t PT_LOAD = 1; static constexpr std::uint32_t PT_DYNAMIC = 2; diff --git a/core/relinker/src/analysis/SyscallScanner.cpp b/core/relinker/src/analysis/SyscallScanner.cpp index a944ec4a8..787428bd8 100644 --- a/core/relinker/src/analysis/SyscallScanner.cpp +++ b/core/relinker/src/analysis/SyscallScanner.cpp @@ -252,4 +252,17 @@ std::unique_ptr MakeSyscallScanner() { return std::make_unique(); } +class NullSyscallScanner : public ISyscallScanner { +public: + void ScanCodeSectionForSyscalls( + const std::vector&, + FileByteOffset, + FileByteOffset + ) override {} +}; + +std::unique_ptr MakeNullSyscallScanner() { + return std::make_unique(); +} + } diff --git a/core/relinker/src/pipeline/RelinkerPipeline.cpp b/core/relinker/src/pipeline/RelinkerPipeline.cpp index d84cd6d6a..88ad23f34 100644 --- a/core/relinker/src/pipeline/RelinkerPipeline.cpp +++ b/core/relinker/src/pipeline/RelinkerPipeline.cpp @@ -12,15 +12,13 @@ RelinkerPipeline::RelinkerPipeline( std::shared_ptr syscallScanner, std::shared_ptr callSiteResolver, std::shared_ptr validationPolicy, - std::shared_ptr dynamicSectionBuilder, - std::shared_ptr callRegistryWriter) + std::shared_ptr dynamicSectionBuilder) : _elfReader(std::move(elfReader)) , _dynlibParser(std::move(dynlibParser)) , _syscallScanner(std::move(syscallScanner)) , _callSiteResolver(std::move(callSiteResolver)) , _validationPolicy(std::move(validationPolicy)) , _dynamicSectionBuilder(std::move(dynamicSectionBuilder)) - , _callRegistryWriter(std::move(callRegistryWriter)) {} std::string RelinkerPipeline::_relocationTypeName(std::uint32_t type) {