ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AnyPS5 Relinker深度剖析:PS5的ELF文件如何变成Linux/Windows原生可执行文件

AnyPS5 Relinker深度剖析:PS5的ELF文件如何变成Linux/Windows原生可执行文件 AnyPS5 Relinker深度剖析PS5的ELF文件如何变成Linux/Windows原生可执行文件【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/gh_mirrors/an/AnyPS5AnyPS5 是一款用于将 PS5 可执行文件自动移植到 Linux 和 Windows 的工具其核心组件Relinker重链接器负责把 PS5 游戏的主 ELF 文件转换成目标系统的原生格式全程无需模拟器也无需额外的运行时进程。下面这篇文章带你从零理解 Relinker 是如何完成这项格式转换魔术的。1. Relinker 是什么为什么它很关键 传统上想在 PC 上运行 PS5 游戏需要一层完整的模拟器来翻译硬件指令。而 AnyPS5 走的是另一条路只转换文件格式 实现系统库让游戏代码直接以 x86-64 指令在 CPU 上原生执行。整个工具链由两部分组成组件作用位置Relinker将 ELF 转换成 Linux ELF 或 Windows PE 格式core/relinker/系统 PRX 库实现 PS5 系统调用的替代库供动态链接core/libs/prx/Relinker 本身只依赖 C20 标准库任何符合标准的编译器都能构建。程序入口在 main.cpp它把整个流程串成一条清晰的流水线输入 ELF → 分析重定位 → 过滤未用符号 → 重写动态段 → 输出目标格式可执行文件2. 转换流水线从输入到输出的四步走 第一步解析 ELF提取符号引用PS5 游戏主程序是一个 x86-64 ELF 文件但它引用的并不是 Linux 的 glibc而是 PS5 的系统库以 NID——数字标识符形式命名。RelinkerPipeline.cpp 中的Relink()函数完成了核心分析读取程序头Program Header定位可执行的.text代码段和PT_DYNAMIC动态段解析动态段中的DT_NEEDED、DT_JMPREL、DT_RELA等标签遍历所有重定位表条目把每一条对系统库函数的引用收集为NidReferenceNID 名称、库名、重定位类型、地址顺带扫描代码段确认没有残留的系统调用指令syscall——因为 PC 上 PS5 的系统调用号是无效的。第二步智能过滤没用到的符号 ✂️游戏编译后往往会引用数百个系统函数但实际运行时真正用到的可能只有几十个。如果全部保留运行时就要求每一个函数都有实现移植难度大增。Relinker 提供了三档过滤级别unused-filter0|1|2级别 0不过滤全部保留级别 1保留全部 PLT函数调用跳板条目仅对非 PLT 引用做过滤级别 2严格模式基于控制流分析找出程序实际会执行到的代码路径只保留真正被访问的 GOT 槽位。级别 2 的实现见 UnusedNidFilter.cpp它会收集入口点main 与异常处理入口构建控制流图CFG再建立 GOT 访问索引判断每个 GOT 槽是否可达。同时配套的 PltCompactor 会把 PLT 表压缩到只包含仍在使用的槽位输出时打印类似NID total: 348 - 57; filtered291 PLT compaction: 1024 - 57数字越小意味着后续需要实现的系统函数越少。第三步重写动态段与 PLT/GOT过滤完成后SysVDynamicSectionBuilder.cpp 会重新生成dynamic段新的符号表、字符串表、PLT 重定位表全部按过滤后的 NID 列表重建RELATIVE类型的重定位则原样保留它们与系统库无关只涉及自身地址修正。同时CallSiteResolver 会扫描代码段定位每个 GOT 槽对应的call指令位置。这些调用点信息可以随--registry参数导出为 JSON 文件*.registry.json方便开发者核对每个引用究竟在哪里被调用。第四步格式落地——Linux ELF 或 Windows PE这是 Relinker 最出彩的部分由elfpatcher模块完成Linux 目标LinuxElfPatcher.cpp 在原 ELF 基础上重排程序头、重写入口桩entry stub、重建节头表产出一个标准 Linux x86-64 ELF。游戏运行时系统的动态链接器会按新DT_NEEDED加载libs/*.prx——AnyPS5 实现的项目名系统库如 libkernel、libc。Windows 目标WindowsPePatcher.cpp 则把整份 ELF转换为 PE 格式解析 DOS/NT 头、构建导入表、重定位表、节布局见 windows/ 下的 ImportBuilder、RelocationBuilder、LoadImage 等一组实现并支持--windows-gui生成无控制台窗口的 GUI 程序。另外如果你的 CPU 是 Intel 而游戏代码使用了 AMD 专有的指令SSE4a、SHA-NI 等--to-intel选项会启动 codegen 模块能原地替换的指令直接替换替换不了的则生成蹦床桩trampoline stub保证在 Intel 平台上也能正确执行。3. 处理随游戏的 sce_module 模块 很多 PS5 游戏主目录里还带有一个sce_module单个或sce_modules多个目录里面是游戏自己的附加 PRX 模块。GuestModuleBuilder.cpp 会扫描这些模块验证 ELF 魔数、检查导出符号冲突重名函数会直接报错防止符号被错误覆盖然后把每个模块同样走一遍重链接流程输出到可执行文件旁边的目录。整个输出布局在运行结束时会被打印出来输出文件 libs/ *.prx app0/ 游戏资源 sce_module/ 转换后的游戏模块游戏资源app0和系统库libs需要按这个布局单独摆放Relinker 只负责可执行文件和模块本身。4. 动手试试命令行参数速查 ⌨️Relinker 采用极简的 CLI 风格用法形如relinker [选项] 输入.elf 输出.elf常用选项一览参数解析逻辑见 CliArgs.cpp参数说明--windows输出 Windows PE 格式的 .exe--windows-guiWindows GUI 程序隐藏控制台窗口--to-intel将 AMD 专有指令降级为 Intel 兼容指令unused-filter0/1/2NID 过滤级别2 为基于 CFG 的严格过滤--registry额外输出调用点注册表 JSON--rpath 路径自定义运行时库搜索路径默认$ORIGIN/libs--lazy-binding延迟绑定与 guest 模块互斥--skip-sce-module跳过 sce_module 目录处理--autorun转换完成后自动运行输出程序--skip-syscall-check跳过系统调用扫描校验一个 Linux 转换的典型命令relinker unused-filter2 --registry sce_app0.elf game.elf如果你发现输出文件名以.exe结尾但没加--windows程序会友好地警告你输出实际仍是 Linux ELF。5. 工程质量测试与文档 ️Relinker 的每个关键环节都有对应的测试用例ELF 头解析test_elf_header.py、test_elf_offsets.pyTLS线程局部存储处理test_guest_tls.py、test_empty_tls.py严格过滤与 PLT 压缩StrictNidFilterTests.cppWindows 目标转换test_windows_gui.py、Amd64OnlyWindowsTests.cppIntel 指令降级Amd64OnlyConverterTests.cpp这种遇到不支持的状态立即抛出异常并打印偏移量的严格策略见 README.md 中的说明意味着转换失败时你能拿到精确的失败位置而不是一个模糊的错误。6. 总结一条不模拟的移植之路 回顾整个流程Relinker 做的事情可以浓缩为四句话读懂解析 PS5 ELF提取所有对系统库的 NID 引用精简用控制流分析砍掉用不到的符号只保留最小依赖集重写重建 dynamic 段与 PLT/GOT让动态链接器按新表工作转生Linux 上微调 ELF 结构Windows 上整体改写成 PE 格式。配合 core/libs/prx/ 下持续完善的系统库实现docs/dev/TechnicalDebt.md 记录了当前的技术债务与进度AnyPS5 让 PS5 游戏得以在 PC 上以原生代码执行——目前已有 兼容性清单 中验证过的游戏在 GTX 1050 Ti 上稳定跑到 60 FPS。如果你想参与这个项目可以先阅读 docs/dev/CONVENTIONS.md 了解代码规范再参考 CONTRIBUTING.md 的协作指南。对 ELF/PE 格式细节感兴趣的话从 ElfReader.cpp 读起是理解整个 Relinker 的最好起点。【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/gh_mirrors/an/AnyPS5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表