refactor(core): remove extra targets and cmake lists
This commit is contained in:
parent
850eae37eb
commit
0fe6ad11f4
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
add_library(domain INTERFACE)
|
||||
target_include_directories(domain INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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);
|
||||
|
|
@ -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)
|
||||
|
|
@ -7,6 +7,7 @@
|
|||
namespace Relinker {
|
||||
|
||||
std::unique_ptr<ISyscallScanner> MakeSyscallScanner();
|
||||
std::unique_ptr<ISyscallScanner> MakeNullSyscallScanner();
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue