
AnyPS5 项目解析:把 PS5 可执行文件重链接成原生 Linux / Windows 程序
AnyPS5 是一套把 PS5 可执行文件自动转换为 Linux / Windows 原生程序的工具链:内置 relinker 直接改写二进制格式,并配套 PS5 系统 prx 库的原生实现,不做指令级模拟、也不需要独立运行时进程。目前已在 Dreaming Sarah 上验证可玩,仓库获约 2.7 万 Star,最新版本 v0.1.1。
相关标签
项目概览
AnyPS5 是一个把 PS5 可执行文件自动移植到 Linux 与 Windows 的工具链项目,由 boykopovar 以 C++ 开发,采用 GNU GPL version 2 only 许可。它的目标不是”运行一个 PS5 模拟器”,而是把原版可执行文件转换成本机原生程序:内置的 relinker(core/relinker)负责把可执行文件改写为目标系统的原生格式,同时项目提供一整套适合动态链接的 PS5 系统 prx 库实现(core/libs/prx)。README 的定位表述很直接——没有模拟,也没有独立的运行时进程(No emulation or separate runtime process)。
截至 2026 年 10 月 11 日,仓库仍是活跃开发状态:约 26,963 Star、2,264 Fork,主语言 C++,默认分支 main,最新发布版本为 v0.1.1(2026-09-28)。
它解决什么问题
传统”在 PC 上跑主机游戏”的思路是模拟器:从硬件开始逐层模拟整台主机,游戏运行在被模拟的 CPU 与系统环境里。AnyPS5 换了一条路——重链接(relink)。
- 原版可执行文件被转换成目标系统的原生二进制:Linux 下是 ELF,Windows 下是 PE。
- 游戏运行时不再是”被解释的客户机代码”,它就是一个普通的本机进程。
- 它调用的 PS5 系统函数,由项目用原生代码实现的 prx 库顶替;动态链接在启动时按 NID 完成绑定。
换句话说,模拟器解决的是”重建一台主机”,而 AnyPS5 解决的是”让一个二进制文件换一个宿主还能活”。
核心机制
1. relinker:一次转换流水线
core/relinker/main.cpp 按固定顺序执行各阶段,架构文档给出的主链路是:
- 按 NID 读取可执行文件的导入表;
- 扫描 syscall;
- 过滤未使用的 NID 引用(
unused-filter=0|1|2,从”全保留”到”严格分析并压缩 PLT”); - 构建 SysV 动态段;
- 由
GuestModuleBuilder转换随附的捆绑模块(sce_module/、sce_modules/或prx/); - 最后交给
LinuxElfPatcher或WindowsPePatcher输出成品。
可选的 --to-intel 分支会降低可执行文件与捆绑模块中仅 AMD 支持的指令,为 x86 主机做准备。
2. 按 NID 绑定的原生库
core/libs/prx 下的每个库都构建为共享库。构建完成后,nid_patcher(core/libs/nid)会把每个导出符号按函数名重命名为其 NID;当函数名未知时,可以用 APS5_EXPORT("<nid>", func) 直接指定。运行时由操作系统的加载器按 NID 完成导入绑定——这也意味着系统库必须为目标操作系统构建。
3. 图形栈:把 RDNA 着色器重编译成 SPIR-V
游戏侧的 AGC 命令缓冲(DCB / ACB)经 libSceAgcDriver/Submit 进入 Execution/Pm4 的状态、绘制与派发处理,随后进入着色器重编译器(core/shader/recompiler):
RdnaDecoder → ControlFlow(控制流图与结构化)→ Translation(RDNA 到 IR)→ Optimization(SSA、资源与绑定)→ SpirvBackend(输出 SPIR-V)→ libSceAgcDriver/Graphics 的 Vulkan 管线。
编译好的变体会先留在内存,并由 ShaderDiskCache 落盘复用。在设备支持 VK_EXT_graphics_pipeline_library 快速链接、VK_EXT_extended_dynamic_state 与 VK_KHR_dynamic_rendering 时,绘制走 vkCmdBeginRenderingKHR,管线由四个库链接而成,另一套混合、顶点布局或目标格式只需重建对应那一个部分。README 同时说明,着色器重编译器可以成功产出 SPIR-V,并在以 ANYPS5_ENABLE_SPIRV_TOOLS 构建时通过 Spirv-Tools 校验。
4. 线程与取消语义
由于不再有模拟层,客户机线程语义需要用原生线程实现对齐。架构文档给出了细节:取消请求记录在目标客户机线程上,新线程默认启用并延迟取消;取消经 scePthreadExit 退出,先按逆序执行清理处理器,再执行线程专用析构器。参考契约取自 FreeBSD libthr,并明确标注为”参考语义,而非主机实测值”。
路线差异
| 维度 | 模拟器路线 | AnyPS5 的重链接路线 |
|---|---|---|
| 运行形态 | 游戏运行在被模拟的 CPU / 系统环境中 | 游戏作为本机原生进程直接运行 |
| 系统调用 | 拦截并转发到模拟实现 | 动态链接到原生 prx 库,按 NID 绑定 |
| 图形 | 模拟 GPU 命令流 | AGC 命令流 + RDNA 着色器重编译为 SPIR-V,走 Vulkan |
| 产物 | 一个模拟器程序 | 一个改写过的可执行文件 + libs/ + app0/ |
这条路线的代价也很直白:未被实现的系统函数会直接抛出异常。README 明确写着,不受支持或非预期的状态会严格抛出 std::runtime_error,what() 打印到 stderr 后进程终止——没有静默降级。
技术栈与安全边界
- x86-64 主机、Git、CMake 3.22.1 或更新、Ninja、C++20。
- Linux:GCC / G++ / binutils;SDL 的 X11 后端需要 X11 与 Xext 开发头文件。
- Windows:目前仅支持 MinGW-w64 GCC 15.2.0(WinLibs
x86_64-ucrt-posix-seh)。 - 完整构建还会初始化子模块,并涉及 SDL、Vulkan、FFmpeg、FreeType 与着色器重编译器。
- macOS 也可作为输出目标:生成 x86-64 Mach-O,在 Apple 芯片上经 Rosetta 运行;转换产物仍需要为目标操作系统构建的系统库与兼容的 x86-64 宿主。
项目在 README 中给出明确的使用边界:该项目面向互操作、研究、保存与兼容性目的,不包含、不分发、也不要求任何受版权保护的软件、固件、加密密钥或专有库;使用者需自行确保所用二进制文件符合法律与相应许可条款。许可是 GNU GPL version 2 only。
快速开始
只需要转换工具本身时,可以不初始化子模块、不配置 SDL / Vulkan / FFmpeg / FreeType,单独构建 relinker:
cmake -S . -B build-relinker -G Ninja -DCMAKE_BUILD_TYPE=Release -DANYPS5_RELINKER_ONLY=ON -DBUILD_TESTING=ON
cmake --build build-relinker --parallel
ctest --test-dir build-relinker --output-on-failure
完整构建:
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++
cmake --build build --parallel
cmake --build build --target libs --parallel
libs 是自定义目标,core/libs/prx 下的库都是 EXCLUDE_FROM_ALL,只有第二步会刷新 build/core/libs/libs 里被改写过的 .prx 文件——改了库却没有重建它,跑出来的还是旧二进制。
转换一个可执行文件:
relinker source/input.elf app.elf
relinker --windows source/input.elf app.exe
relinker --macos source/input.elf eboot
注意:输出格式默认始终是 Linux ELF,.exe 后缀本身不会选择 Windows;输入应使用干净的 ELF 可执行文件,其捆绑模块放在可执行文件旁的 sce_module/、sce_modules/ 或 prx/ 目录中。
运行时的目录布局是:
app.elf (Linux) or app.exe (Windows)
libs/
*.prx
app0/
<app resources>
sce_module/
<converted modules>
主要能力与常用配置
relinker 的全部开关默认关闭,--rpath 默认为 $ORIGIN/libs。几个关键项:
--windows/--macos:选择输出格式,两者冲突;--windows-gui切换 GUI 子系统,--windows-diagnostics加入启动依赖诊断。--to-rosetta:按--to-intel转换,并把 Rosetta 缺少的指令降级——RDSEED 变 RDRAND、CLWB 变 NOP、RDPID 返回处理器 0。unused-filter=0|1|2:从保留全部导入,到基于控制流与 GOT 访问分析过滤未用非 PLT 导入,再到严格分析并压缩 PLT。--registry:为可执行文件与每个被转换的捆绑模块写出 registry JSON。--autorun:转换后直接运行产物并打印退出码,同时为 Linux 产物加上可执行权限。- 退出码:
0转换成功,1参数非法,2转换失败(错误打印到 stderr)。
运行期的若干环境变量也值得留意:ANYPS5_LANGUAGE 指定主机语言(如 21 为阿拉伯语),ANYPS5_GPU 按名称片段选择 Vulkan 设备,ANYPS5_SYSTEM_FONTS 指定系统字体目录(缺失时可用 Noto 系列替代),APS5_STORE_AT_FLIP=1 在每个显示缓冲翻页时把待写入的 GPU 结果落盘。诊断工具 tools/import_audit.py 可以在启动游戏之前,列出已转换游戏导入的系统函数,以及已构建库是否提供了它们,并把每个引用归入 implemented、stub、absent、module 四类之一。
输入方面,支持 SDL 映射的手柄(含摇杆与模拟扳机,可热插拔,以第一个识别到的手柄为准);键鼠映射可通过产物旁的 anyps5-input.ini 配置,格式为 Action = Type:Value,支持 KEY:、MOUSE:、WHEEL: 三种输入源。
项目状态与许可
- 已验证游戏:目前兼容性列表中只有一款——Dreaming Sarah(2D 平台跳跃,ID
PPSA02929),Windows 状态为”In game, playable”,Linux 侧标记为待确认。 - 实测性能:GTX 1050 Ti / i5-7500 3.4GHz 上稳定 60 FPS;Intel HD Graphics 620 / i5-7200 2.5GHz 上为 36 FPS。
- 进度口径:项目的库进度徽章统计的是”目前为止项目已知函数的实现比例”(以
core/libs/prx中声明为准),并非 PS5 全部系统函数;随着更多函数被声明,分母会持续增长。进度图与徽章发布在项目主页。 - 技术债:项目把静默行为与未经验证的假设都记录在
docs/dev/TechnicalDebt.md中,着色器重编译器与部分异步语义也在其中标注。 - 许可:GNU GPL version 2 only。
获取与了解
- 仓库与 README:https://github.com/boykopovar/AnyPS5
- 最新版本:v0.1.1(2026-09-28),发布页 https://github.com/boykopovar/AnyPS5/releases/tag/v0.1.1
- 项目进度与兼容性主页:https://boykopovar.github.io/AnyPS5/
- 社区:Discord https://discord.gg/BHFztBPUe
v0.1.1 相比 v0.1.0 合并了一批实质性改动,包括移植 shadPS4 的 sceFont / sceFontFt(基于 FreeType)、新增存档数据的挂载/目录/内存槽核心、libSceMsgDialog 的对话框状态机、离线 socket / epoll / resolver 栈(带 FreeBSD errno 映射)、libSceAvPlayer 的完整状态机、着色器标量 64 位反转与算术移位支持,以及 relinker 侧 app0 客户机模块布局的修正。
更多资讯
想看更多优质内容?
浏览所有资讯