N64Recomp/N64Recomp
开发工具把 N64 二进制静态重编译为可移植 C 代码,用于原生移植、补丁和独立运行。
项目介绍
N64: Recompiled 接收 N64 二进制以及符号和元数据信息,将其静态重编译成 C 源码,可再编译到任意平台。输入二进制会按函数切分,每个函数生成一个按元数据命名的 C 函数;指令逐条直译,例如 addiu 会变成 ADD32 表达式。函数调用、可识别为尾调用优化的跳转、分支延迟槽都会在翻译阶段处理,跳转表模式可能被转换成 switch 语句。产物是 C 代码,不是 N64 模拟器;还需要运行时提供内存、宏实现和 overlay 函数查找。详见 How it Works。
它面向做原生移植、独立工具或需要快速模拟 N64 代码的开发者,也能处理静态链接和可重定位 overlay。对可重定位 overlay,它会生成重定位宏,由运行时在加载时解析;TLB 映射重定位列在计划中。RSP microcode 也能重编译,但暂不支持 RSP overlay。README 指向配套的 N64ModernRuntime 和实际案例 Zelda 64: Recompiled。
构建与运行
重编译器用第一个参数传入 TOML 配置文件,其中指定输入输出路径,并可选择 stub 函数、跳过函数或修补单条指令。当前所需元数据来自 ELF 文件,所以要先为目标二进制准备反汇编或反编译环境;自定义元数据格式还在计划中。README 说明完整选项文档尚未提供,但给出了一个 示例 TOML。
构建需要 CMake 3.20+ 和支持 C++20 的编译器。递归拉取子模块后,用 CMake 配置并构建:
git clone --recurse-submodules https://github.com/N64Recomp/N64Recomp.git
cd N64Recomp
mkdir build && cd build
cmake ..
cmake --build .
构建完成后,以配置文件作为第一个参数调用重编译器。生成的 C 文件需要兼容的运行时才能编译和运行;README 没有给出「从原始 ROM 直接得到可玩游戏可执行文件」的单条命令。
单文件输出模式会把所有函数写进一个 C 文件,用于编译修补后的函数,并让链接器优先采用补丁版本而非原始目标代码;README 链接了 Zelda 64: Recompiled 的 补丁配置 和 Makefile 作为示例。
使用约束
需要带符号和重定位元数据的 ELF,实践中意味着目标二进制要有反汇编或反编译工程。输出 C 依赖运行时提供的宏和函数查找,没有对应运行时无法直接运行。RSP overlay 和 TLB 重定位尚未实现。现代 MIPS GCC 的某些优化可能让重编译器出错,较老的 MIPS 编译器和面向 MIPS 的现代 Clang 经过测试。构建时必须递归初始化子模块。项目使用 MIT 许可证。
HotRepo 点评
N64: Recompiled 在 HotRepo 记录到一条 2024 年 5 月的 Hacker News 讨论,只有一条短评论指向六天前另一场更大讨论(27 分),没有补充技术评论。提供的 HotRepo 记录中没有 GitHub 日榜快照或 Star 曲线采样,8,390 Star、473 Fork 只是累计关注度,不能据此判断趋势。它的技术价值体现在 C 产物和运行时接口上,而不是一键 ROM 转换器,评估它是否适合移植或补丁工作流时应先确认这一点。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。