refactor(core): remove extra targets and cmake lists

This commit is contained in:
boykopovar 2026-08-04 01:24:23 +03:00
parent 850eae37eb
commit 0fe6ad11f4
11 changed files with 70 additions and 53 deletions

View File

@ -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)

21
core/CMakeLists.txt Normal file
View File

@ -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
)

View File

@ -1,2 +0,0 @@
add_library(domain INTERFACE)
target_include_directories(domain INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)

View File

@ -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)

View File

@ -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)

View File

@ -13,16 +13,32 @@
#include <relinker/pipeline/RelinkerPipeline.hpp>
#include <iostream>
#include <memory>
#include <string>
#include <optional>
int main(const int argc, char* argv[]) {
if (argc < 4) {
std::cerr << "Usage: relinker <input.elf> <output_registry.json> <output.elf>\n";
return 1;
bool skipSyscallCheck = false;
std::string inputPath;
std::string outputElfPath;
std::optional<std::string> 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] <input.elf> <output.elf> [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<Relinker::SdkRevisionProfile>(sceDynlibData);
auto syscallScanner = skipSyscallCheck
? Relinker::MakeNullSyscallScanner()
: Relinker::MakeSyscallScanner();
const auto pipeline = std::make_shared<Relinker::RelinkerPipeline>(
elfReader,
std::make_shared<Relinker::SceDynlibParser>(sdkProfile),
Relinker::MakeSyscallScanner(),
std::move(syscallScanner),
Relinker::MakeCallSiteResolver(),
std::make_shared<Relinker::ValidationPolicy>(),
std::make_shared<Relinker::SysVDynamicSectionBuilder>(),
std::make_shared<Relinker::CallRegistryWriter>()
std::make_shared<Relinker::SysVDynamicSectionBuilder>()
);
auto result = pipeline->Relink(sourceBytes);
auto callRegistryWriter = std::make_shared<Relinker::CallRegistryWriter>();
fileWriter.Write(registryPath, callRegistryWriter->WriteCallRegistry(result.RegistryEntries));
if (registryPath.has_value()) {
auto callRegistryWriter = std::make_shared<Relinker::CallRegistryWriter>();
fileWriter.Write(*registryPath, callRegistryWriter->WriteCallRegistry(result.RegistryEntries));
}
Elfpatcher::ElfPatcher elfPatcher;
auto patchedElf = elfPatcher.Patch(sourceBytes, result.OriginalHeaders, result.DynamicSection);

View File

@ -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)

View File

@ -7,6 +7,7 @@
namespace Relinker {
std::unique_ptr<ISyscallScanner> MakeSyscallScanner();
std::unique_ptr<ISyscallScanner> MakeNullSyscallScanner();
}

View File

@ -9,7 +9,6 @@
#include <relinker/domain/ICallSiteResolver.hpp>
#include <relinker/domain/IValidationPolicy.hpp>
#include <relinker/domain/ISysVDynamicSectionBuilder.hpp>
#include <relinker/domain/ICallRegistryWriter.hpp>
#include <memory>
namespace Relinker {
@ -22,8 +21,7 @@ public:
std::shared_ptr<ISyscallScanner> syscallScanner,
std::shared_ptr<ICallSiteResolver> callSiteResolver,
std::shared_ptr<IValidationPolicy> validationPolicy,
std::shared_ptr<ISysVDynamicSectionBuilder> dynamicSectionBuilder,
std::shared_ptr<ICallRegistryWriter> callRegistryWriter
std::shared_ptr<ISysVDynamicSectionBuilder> dynamicSectionBuilder
);
RelinkResult Relink(const std::vector<std::uint8_t>& sourceElf) override;
@ -35,7 +33,6 @@ private:
std::shared_ptr<ICallSiteResolver> _callSiteResolver;
std::shared_ptr<IValidationPolicy> _validationPolicy;
std::shared_ptr<ISysVDynamicSectionBuilder> _dynamicSectionBuilder;
std::shared_ptr<ICallRegistryWriter> _callRegistryWriter;
static constexpr std::uint32_t PT_LOAD = 1;
static constexpr std::uint32_t PT_DYNAMIC = 2;

View File

@ -252,4 +252,17 @@ std::unique_ptr<ISyscallScanner> MakeSyscallScanner() {
return std::make_unique<SyscallScanner>();
}
class NullSyscallScanner : public ISyscallScanner {
public:
void ScanCodeSectionForSyscalls(
const std::vector<std::uint8_t>&,
FileByteOffset,
FileByteOffset
) override {}
};
std::unique_ptr<ISyscallScanner> MakeNullSyscallScanner() {
return std::make_unique<NullSyscallScanner>();
}
}

View File

@ -12,15 +12,13 @@ RelinkerPipeline::RelinkerPipeline(
std::shared_ptr<ISyscallScanner> syscallScanner,
std::shared_ptr<ICallSiteResolver> callSiteResolver,
std::shared_ptr<IValidationPolicy> validationPolicy,
std::shared_ptr<ISysVDynamicSectionBuilder> dynamicSectionBuilder,
std::shared_ptr<ICallRegistryWriter> callRegistryWriter)
std::shared_ptr<ISysVDynamicSectionBuilder> 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) {