
项目概述
该项目实现了任天堂GameCube平台游戏《生化危机4》的完整、字节级精确反编译。工程基于G4BE08调试构建版本(即“2004年11月25日”原型,含双光盘),利用Bio4.sym文件对所有函数进行了命名。构建结果可完全重现main.dol及全部114个REL覆盖模块,并通过config/G4BE08/build.sha1进行每次构建的校验。
项目包含1083个对象文件(DOL中675个,114个REL中共计408个),均实现字节级一致,涉及15641个函数。源代码部分包含约55.5万行C/C++代码(src/目录)及约3.3万行头文件(include/目录),不含汇编文件。
编译环境方面,游戏代码使用SN Systems ProDG 3.9.3 — GCC 2.95.3 “SN BUILD v1.79”,基于SN发布的GPL源码原生构建;CRI中间件使用Metrowerks CodeWarrior 2.4.7 (GC/2.7);Nintendo SDK使用Metrowerks CodeWarrior GC/1.2.5n,源码源自dolsdk2004。
需注意,仓库不包含任何游戏资源文件,也未复制光盘中的代码或数据。用户需自备调试光盘镜像以进行构建:第一张光盘用于获取main.dol和大部分REL模块,第二张光盘用于获取四个岛屿关卡阶段的REL模块。原始文件在配置阶段从这些镜像中读取。
构建与验证
构建环境需要Linux系统、Python 3和Ninja工具。首次配置运行时,编译器及工具链(decomp-toolkit, objdiff, wibo及CodeWarrior构建环境)将自动下载,但原生的SN GCC除外。
构建步骤如下:
- 构建原生cc1/cc1plus(仅需一次):需使用SN的GPL源码,执行tools/sn-gcc/build.sh。
- 准备光盘镜像:将re4_debug_disc1.iso和re4_debug_disc2.gcm复制到orig/G4BE08/目录。
- 执行构建并验证:运行python3 configure.py && ninja。
Ninja执行完毕后,进度报告将显示DOL和REL模块的匹配与链接均为100%。运行build/tools/dtk shasum -c config/G4BE08/build.sha1将打印出115行“OK”。若需修改特定单元,可使用python3 tools/bytecmp.py game/foo对比对象文件与原版的每一个字节,或使用python3 tools/fdiff.py game/foo <符号名>查看单个函数的差异。
目录结构说明
- src/game/:游戏主程序(C++及少量newlib C单元)。其中src/em*/为敌人,src/wep*/为武器,src/pl*/为玩家角色,src/st*/为房间(每个房间对应一个REL),src/t_*/, src/Tools/, src/tools/为游戏内调试编辑器,src/Sscrn/为子屏幕,src/lib/为SDK、CRI中间件和运行时库。
- include/:头文件,包含重建的结构体布局定义。
- config/G4BE08/:包含单元列表(objects.py, modules.py)、symbols.txt、splits.txt、链接脚本、各模块的REL数据及build.sha1。
- tools/:包含构建生成器、ProDG驱动、REL重构建工具、对比工具、sn-gcc原生编译器构建脚本、编译器分析套件以及动画导出工具(支持glTF/BVH,使用游戏自身代码评估并与Dolphin模拟器验证)。
- docs/:包含引擎组装指南、匹配过程说明、各单元笔记及逐层研究日志。
“匹配”机制详解
项目中每个单元均能使用原始编译器编译出与原版字节完全一致的结果。当编译器需要特定的源码形态来复现寄存器选择或调度策略,且未找到自然写法时,相关构造会被标记为// COMPILER-DIFF:注释。此类标记共644处,包括死测试、空asm("")清洗语句、register T x asm("rN")引脚固定及填充语句。这些标记均不产生指令。
运行python3 tools/asmcheck.py --all会将所有GCC单元与其带模板标记的汇编一起编译,并列出源自模板的指令。仅有231条硬件内核命中(八个纯汇编单元单独列示,不计入此总数)。项目早期版本在游戏代码中约有100条手动放置的指令,在CRI库中约有100个寄存器固定块asm { },它们已于2026-09-17被替换为C代码。每个标签的机制均在docs/matching.md和docs/research/中有详细记录。
剩余的汇编代码均为原版作者因编译器无法表达而亲自编写的部分:
- GCC 2.95 游戏代码:包括配对单精度内核(如SINF/COSF/RSQRT/LIMIT_ANGLE等)、矩阵内核、量化psq_l、main/scheduler中的GQR设置以及libsn的sndvd异常处理程序。
- MWCC CRI库:包括配对单精度/缓存/SPR内核、SDK的内在函数以及dct_ac中的一个寄存器引导块。此外,保留了27处无代码的asm { mr r11, x; mr x, r11 }引脚固定和asm { mr v, v }自拷贝。
- 八个纯汇编单元:包括crt0 (__start), eabi, SN的tealeaf/fileserver/ppcdown/proview,以及Capcom的memset_2和yz2asm。这些单元在原版中即为汇编,因此在本项目中以C文件形式存在,其函数整体为GAS语法顶层的asm()主体,由ProDG驱动编译。
命名与贡献
函数名称源自Capcom调试构建的Bio4.sym文件。由于存在C++名称修饰,游戏代码为C++,而SDK、CRI和newlib单元为C。文件名和单元边界来自二进制文件中断言留下的D:/Bio4/Prog/<file>.cpp字符串。结构体和字段名称分为厂商提供(来自PS2调试构建)、项目组命名及占位符xNN三类。#line指令复现了断言字符串中的厂商行号。
贡献者需遵循CONTRIBUTING.md中的构建流程、三项验证检查及规则(字节永不改变、禁止发射指令的汇编、命名规范)。
法律声明
重建的游戏和SDK源代码属于各自所有者(Capcom、Nintendo、CRI Middleware)的知识产权,仅发布用于研究和保存目的。为本项目编写的构建脚本、工具和文档以CC0协议发布。