什么是静态重编译?MarathonRecomp从PowerPC到C++的移植原理全解析 【免费下载链接】MarathonRecompAn unofficial PC port of the Xbox 360 version of Sonic the Hedgehog (2006) created through the process of static recompilation项目地址https://gitcode.com/gh_mirrors/mar/MarathonRecomp点击查看免费下载MarathonRecompMarathon Recompiled是一个通过静态重编译Static Recompilation技术将 Xbox 360 版《Sonic the Hedgehog (2006)》移植到 PC 的非官方开源项目。它不做运行时模拟而是把游戏原本的 PowerPC 代码直接转写成可读的 C 源码、把 GPU 着色器转成 HLSL让游戏在 Windows、Linux 和 macOS 上以接近原生的方式运行。本文将用通俗的语言带你完整看懂它的工作原理。一分钟看懂静态重编译 vs 传统模拟器对比项传统模拟器Emulator静态重编译Recompilation运行方式运行时逐条解释/翻译指令提前把机器码翻译成宿主代码直接编译产物无每次运行都要翻译可阅读的 C 源码 着色器代码性能受翻译开销影响接近原生可修改性只能打内存补丁可直接在源码级别修改游戏逻辑可维护性难以长期维护像普通 C 工程一样开发打个比方模拟器像是同声传译边说边翻静态重编译则是先把整本书翻译出版之后所有人读的都是译文。这也是为什么项目 README.md 强调它NOT meant for public use仍在积极开发中——因为整个游戏的代码都要被重写成一份可编译的工程。项目是怎么组织这场翻译的整个仓库分成三大块理解它们就理解了移植的骨架重编译工具tools/XenonRecomp 负责把 PowerPC 指令转成 Ctools/XenosRecomp 负责把 Xenos GPU 着色器转成 HLSL。重编译产物库MarathonRecompLib 存放工具链的配置与生成出的 C 代码。宿主运行时MarathonRecomp 是你真正运行的程序包含窗口、输入、音频、文件系统模拟和补丁层。第一步把游戏代码翻译成 146 个 C 文件构建系统 MarathonRecompLib/CMakeLists.txt 中有一个关键循环它会调用 XenonRecomp为ppc_recomp.0.cpp到ppc_recomp.145.cpp共146 个源文件生成内容——这就是整个游戏default.xex可执行文件里 PowerPC 代码的翻译结果。工具的配置写在 MarathonRecompLib/config/Marathon.toml.in其中包含functions列表告诉工具这是一个函数入口请从这里开始翻译invalid_instructions标记哪些字节序列不是指令比如 C 异常帧表避免误翻译midasm_hook汇编级钩子在翻译出的代码中插入宿主 C 逻辑的接线点后文会重点讲。而 MarathonRecompLib/config/switch_table.toml 则记录了 PowerPC 中switch语句的跳转表位置。PowerPC 的跳转表是数据不是代码工具需要借助这份地图才能正确还原出switch-case结构否则翻译结果会是一堆无法维护的跳转。第二步把着色器翻译成 HLSL游戏的图形代码藏在shader.arc归档文件里。构建时先由 tools/u8extract 解包归档再由 XenosRecomp 把 Xenos 着色器逐条转成 MarathonRecomp/gpu/shader/hlsl 风格的 HLSL 代码最终打包成一个shader_cache.cpp见 MarathonRecompLib/shader/shader_cache.h。运行时则通过第三方抽象层 plume 在 D3D12、Vulkan、Metal 等后端上执行这些着色器——也就是说Xbox 360 显卡指令已经被彻底换成了现代 GPU 能直接编译的语言。核心机制让游戏代码住进一个模拟内存空间翻译出来的代码不能直接跑因为游戏代码满脑子都是内存地址 0x82xxxxxx。MarathonRecomp 的解法非常巧妙1. 一整块连续的模拟内存MarathonRecomp/kernel/memory.h 中的Memory结构体在启动时申请一整块大内存base把游戏的default.xex映像原样拷贝进去。之后Translate(offset)负责游戏地址 → 宿主地址换算MapVirtual负责反向换算。游戏代码看到的 32 位地址在宿主上变成了真实指针性能几乎零损耗。2. 寄存器即结构体PowerPC 的寄存器状态被建模成一个PPCContext结构体r3~r31整数寄存器、f1~f13浮点寄存器……每个翻译出来的函数都接收(ctx, base)两个参数。你可以在 MarathonRecomp/cpu/ppc_context.h 看到它被做成线程局部变量——因为游戏代码可以跑在任意线程上。3. 游戏主线程就是一个客人线程MarathonRecomp/cpu/guest_thread.h 定义了GuestThread程序入口 MarathonRecomp/main.cpp 在加载完游戏映像后执行GuestThread::Start({ entry, 0, 0 })把游戏的入口点丢进一个真实线程里运行。游戏从此像住进宿主程序的租户通过函数分发表PPCFunc查找表在成千上万个翻译函数之间跳转。4. 跨层调用C 与游戏代码互相调用MarathonRecomp/kernel/function.h 提供了两套桥接工具HostToGuestFunction宿主 C 函数包装成游戏函数参数自动从寄存器/栈中按 PowerPC 调用约定取回返回值写回r3/f1GuestToHostFunction反过来让宿主代码以游戏的方式调用翻译后的函数。指针参数会经过g_memory.MapVirtual/Translate自动在两套地址空间之间转换——这正是静态重编译能保持高性能的关键没有指令翻译层只有普通的函数调用。补丁层在源码级别修游戏这是静态重编译相对模拟器最迷人的能力因为代码是 C所以可以直接写逻辑。MarathonRecomp/patches/ 目录里躺着一整套质量改进补丁宽屏与动态分辨率aspect_ratio_patches、帧率解锁fps_patches、相机控制、文字渲染、加载速度等。而更底层的修改通过前文提到的midasm_hook实现。以 MarathonRecompLib/config/Marathon.toml.in 为例[[midasm_hook]] name SetMSAALevel address 0x82607CD4 registers [r4]含义是在 PowerPC 地址0x82607CD4处拦截把r4寄存器的值交给宿主 C 函数SetMSAALevel处理。配置文件里还能看到InfiniteLives、RestoreChaosSpearFlips、DisableRadialBlur等钩子——它们分别对应无限生命还原混沌尖刺翻转动画禁用径向模糊等玩家选项。配置一个开关翻译出的代码就会在正确的位置跳或不跳某段指令。此外宿主侧也能在游戏函数执行前后插入逻辑例如 MarathonRecomp/app.cpp 中对DocMarathonState::Update的包装先修正帧间隔误差、再执行原始翻译代码、最后读取暂停状态——一个函数调用同时完成了原逻辑 三个增强。那些 api/ 头文件是什么打开 MarathonRecomp/api/ 会看到按游戏类名组织的头文件树Sonicteam/Player/State/SonicContext.h、SoX/Graphics/Texture.h、Chao/CSD/...等。这是团队对游戏内部数据结构类布局、成员偏移的逆向映射结果相当于给整个游戏写了一份接口文档。MarathonRecomp/api/README.md 规定了严格的命名规范与映射规则成员必须带offsetof/sizeof断言保证布局正确、不确定的字段命名为m_Field194用十六进制偏移标注……这套纪律确保了头文件与游戏真实内存布局始终一致。如何参与构建编译步骤速览如果你想亲手体验一次完整的静态重编译流程官方构建文档在 docs/BUILDING.md核心步骤克隆仓库需要子模块即两个重编译器 git clone --recurse-submodules https://gitcode.com/gh_mirrors/mar/MarathonRecomp放入游戏文件将合法获取的default.xex、shader.arc、shader_lt.arc放入MarathonRecompLib/private/仓库不包含任何游戏资产安装依赖Windows 用 Visual Studio 2022含 C Clang 组件Linux 用 clang/cmake/ninjamacOS 用 Xcode构建cmake . --preset linux-release然后cmake --build。第一次编译会比较久——因为 XenonRecomp 要把整个游戏的代码翻译成 146 个 C 文件再把它们全部编译进最终二进制。之后每次构建就是再跑一次翻译 编译。总结静态重编译的完整链路把全文串起来MarathonRecomp 的移植原理可以概括为一条流水线阶段做什么关键文件1. 代码翻译PowerPC → C146 个源文件tools/XenonRecomp、switch_table.toml2. 着色器翻译Xenos Shader → HLSL/Metaltools/XenosRecomp3. 运行时模拟内存 客人线程 寄存器上下文kernel/memory.h、cpu/guest_thread.h4. 补丁层汇编钩子 宿主代码包装实现画质/玩法增强patches/、Marathon.toml.in5. 现代化外壳SDL3 窗口/手柄/音频、安装向导、成就菜单hid/、apu/、ui/一句话总结静态重编译 逆向 代码生成 普通 C 工程开发。游戏从只能在一台停产主机的芯片上跑的机器码变成了一份可以在任何现代电脑上编译、阅读和修改的源代码——这正是 MarathonRecomp 最核心的移植原理。赞分享【免费下载链接】MarathonRecompAn unofficial PC port of the Xbox 360 version of Sonic the Hedgehog (2006) created through the process of static recompilation项目地址https://gitcode.com/gh_mirrors/mar/MarathonRecomp点击查看免费下载相关推荐为什么KartPad不是Wii模拟器深度揭秘静态重编译核心原理为什么KartPad不是Wii模拟器深度揭秘静态重编译核心原理 KartPad 是一款让 Mario Kart Wii 与 Retro Rewind 在 iOReXGlue 是什么为什么 Xbox 360 重编译器要用 AOT 静态重编译一篇看懂核心思路ReXGlue 是什么为什么 Xbox 360 重编译器要用 AOT 静态重编译一篇看懂核心思路 ReXGlue 是一款 Xbox 360 重编译器RecKiwi库架构解密从Simplex算法到内存优化的实现细节Kiwi库架构解密从Simplex算法到内存优化的实现细节 Kiwi是一个高效的C约束求解库它实现了经典的Cassowary算法专为快速求解线性约束系开发工具上一篇arxiv-sanity-preserver批量处理技巧高效管理大量PDF文件下一篇超全解析Fashion-MNIST性能指标评测体系与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考