feat(relinker): scan sce modules for syscalls
This commit is contained in:
parent
630cb018c0
commit
2e654e4f89
|
|
@ -55,10 +55,11 @@ int main(const int argc, char* argv[]) {
|
|||
}
|
||||
|
||||
auto elfReader = std::make_shared<Relinker::ElfReader>(sourceBytes);
|
||||
const std::shared_ptr<Relinker::ISyscallScanner> syscallScanner = args.skipSyscallCheck ? Relinker::MakeNullSyscallScanner() : Relinker::MakeSyscallScanner();
|
||||
|
||||
const auto pipeline = std::make_shared<Relinker::RelinkerPipeline>(
|
||||
elfReader,
|
||||
args.skipSyscallCheck ? Relinker::MakeNullSyscallScanner() : Relinker::MakeSyscallScanner(),
|
||||
syscallScanner,
|
||||
Relinker::MakeCallSiteResolver(),
|
||||
std::make_shared<Relinker::ValidationPolicy>(),
|
||||
std::make_shared<Relinker::SysVDynamicSectionBuilder>(),
|
||||
|
|
@ -77,7 +78,7 @@ int main(const int argc, char* argv[]) {
|
|||
|
||||
std::vector<Relinker::GuestArtifact> guestArtifacts;
|
||||
if (!args.skipSceModule) {
|
||||
guestArtifacts = Relinker::GuestModuleBuilder().Build(args.inputPath, absPath, result.DynamicSection, args.toWindows, args.toIntel, args.skipSyscallCheck, args.lazyBinding, args.runPath);
|
||||
guestArtifacts = Relinker::GuestModuleBuilder().Build(args.inputPath, absPath, result.DynamicSection, args.toWindows, args.toIntel, *syscallScanner, args.lazyBinding, args.runPath);
|
||||
}
|
||||
|
||||
if (args.writeRegistry) {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define RELINKER_GUESTIMAGE_HPP
|
||||
|
||||
#include <domain/Types.hpp>
|
||||
#include <relinker/domain/ISyscallScanner.hpp>
|
||||
#include <filesystem>
|
||||
|
||||
namespace Relinker {
|
||||
|
|
@ -41,7 +42,7 @@ struct GuestArtifact {
|
|||
|
||||
class GuestModuleBuilder {
|
||||
public:
|
||||
std::vector<GuestArtifact> Build(const std::filesystem::path& inputPath, const std::filesystem::path& outputPath, Domain::SysVDynamicSection& dynamic, bool windows, bool toIntel, bool skipSyscallCheck, bool lazyBinding, const std::string& runPath) const;
|
||||
std::vector<GuestArtifact> Build(const std::filesystem::path& inputPath, const std::filesystem::path& outputPath, Domain::SysVDynamicSection& dynamic, bool windows, bool toIntel, ISyscallScanner& syscallScanner, bool lazyBinding, const std::string& runPath) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
#include <relinker/guest/GuestImage.hpp>
|
||||
#include <relinker/analysis/SyscallScanner.hpp>
|
||||
#include <elfpatcher/general/GuestModuleWriter.hpp>
|
||||
#include <codegen/IAmd64OnlyConverter.hpp>
|
||||
#include <io/FileReader.hpp>
|
||||
|
|
@ -12,7 +11,7 @@
|
|||
|
||||
namespace Relinker {
|
||||
|
||||
std::vector<GuestArtifact> GuestModuleBuilder::Build(const std::filesystem::path& inputPath, const std::filesystem::path& outputPath, Domain::SysVDynamicSection& dynamic, const bool windows, const bool toIntel, const bool skipSyscallCheck, const bool lazyBinding, const std::string& runPath) const {
|
||||
std::vector<GuestArtifact> GuestModuleBuilder::Build(const std::filesystem::path& inputPath, const std::filesystem::path& outputPath, Domain::SysVDynamicSection& dynamic, const bool windows, const bool toIntel, ISyscallScanner& syscallScanner, const bool lazyBinding, const std::string& runPath) const {
|
||||
const auto root = std::filesystem::absolute(inputPath).parent_path();
|
||||
const auto singular = root / "sce_module";
|
||||
const auto plural = root / "sce_modules";
|
||||
|
|
@ -61,12 +60,9 @@ std::vector<GuestArtifact> GuestModuleBuilder::Build(const std::filesystem::path
|
|||
std::vector<Domain::ProgramHeader> codeHeaders;
|
||||
for (const auto& header : image.Headers) if (header.Type == 1 && (header.Flags & 1) != 0) codeHeaders.push_back(header);
|
||||
if (toIntel) image.Bytes = Codegen::MakeAmd64OnlyConverter()->Convert(std::move(image.Bytes), codeHeaders).Bytes;
|
||||
if (!skipSyscallCheck) {
|
||||
const auto scanner = MakeSyscallScanner();
|
||||
for (const auto& header : codeHeaders) {
|
||||
const std::vector<std::uint8_t> code(image.Bytes.begin() + header.Offset, image.Bytes.begin() + header.Offset + header.FileSize);
|
||||
scanner->ScanCodeSectionForSyscalls(code, header.MappedAddress, header.FileSize);
|
||||
}
|
||||
for (const auto& header : codeHeaders) {
|
||||
const std::vector<std::uint8_t> code(image.Bytes.begin() + header.Offset, image.Bytes.begin() + header.Offset + header.FileSize);
|
||||
syscallScanner.ScanCodeSectionForSyscalls(code, header.MappedAddress, header.FileSize);
|
||||
}
|
||||
images.push_back(std::move(image));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue