搜索你想找的开源项目

输入名称、用途或关键词,也可粘贴 GitHub 仓库链接

分享到微信

当前解读页的微信分享二维码

用微信扫一扫打开,点击右上角「···」分享给朋友或朋友圈。

手机上可截屏后,在微信扫一扫中从相册识别二维码。

N64Recomp/N64Recomp

开发工具

把 N64 二进制静态重编译为可移植 C 代码,用于原生移植、补丁和独立运行。

8,390
473
C++
MIT
创建于 3 年前

项目介绍

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 生成,更新于 ,以项目官方文档为准。

Hacker News 讨论

N64: Recompiled
▲ 3 · 1 条评论 · 2024年5月25日

相关推荐

  1. vercel-labs/scriptc把 TypeScript/JavaScript 子集编译成独立原生可执行文件或 WebAssembly,运行时不需要 Node.js。TypeScript6,474
  2. adriadam10/mkw-recomp把《马力欧赛车世界》静态重编译为 Linux 和 Windows 原生 PC 程序,需自备游戏转储。C104