
2026/09/21 2:38
バイオハザード4(ゲームキューブ)—— C/C++ に完全なバイト単位のデコンパイル実装
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
まとめ:
本プロジェクトは、2004 年 11 月 25 日に発売されたゲームキューブ版『バイオハザード 4』の完全かつバイト単位で同一のデコンパイルを実現しました。これには、
main.dol および 114 つの REL オーバーレイからなる正確なオリジナルバイナリとソースオブジェクトを再構築することで達成されています。Nintendo および SN システムズの GPL ソースドロップを活用し、チームは 2004 年の開発環境を精密に再現しました:sn-gcc を通じたネイティブ GCC、CRI Middleware の Metrowerks CodeWarrior 2.4.7、および Nintendo SDK の Metrowerks CodeWarrior GC/1.2.5n です。リポジトリには src/ ディレクトリに約 555k 行の C/C++(~33k ヘッダー)と、独立したアセンブリソースファイルは含まれておらず、1,083 つのオブジェクトに跨る 1,564 個以上の関数が含まれています。ninja を使用したビルド検証により、オリジナルのディスクイメージと 100% 一致が確認され、SHA1 チェックサム(115 OK ライン)によって検証されました。再構築されたゲームおよび SDK はキャプコン、Nintendo、および CRI Middleware の知的財産として残りますが、すべてのツールおよび文書は CC0 ライセンスで公開されており、無制限の研究を可能にしています。研究者らは теперь アセンブリの深い知識なしでも高レベルの C++ コードを分析できるようになりました。ただし、一部のユニットでは GCC paired-single カーネルや MWCC キャッシュ/SPR カーネルなどオリジナル作詞のアセンブリが保持されており、asm() ブロック内では GAS シンタックスを使用しています。また、644 ユニットはコンパイラの相違による非自然なソース形状を反映する // COMPILER-DIFF コメントを含んでいます。命名規則は Bio4.sym のマングル関数、ベンダー PS2 マッピング、使用ベースの名称、および hex オフセットプレースホルダー(xNN)に基づいています。ビルド時にディスクイメージが必要であり、これを使用して main.dol/REL および island-stage REL を抽出します。ビルド要件には Linux、Python 3、および ninja が含まれます。この作業は、レガシーコンソールアーキテクチャに対する以前になかった洞察を可能にしつつもオリジナルバイナリへの厳密な忠実性を保つことで、ソフトウェア保存における画期的なマイルストーンとなりました。本文
バイオハザード4 (ニンテンドーゲームキューブ版) 完全デコンパイルプロジェクト
プロジェクト概要
- 対象: バイオハザード 4(ニンテンドーゲームキューブ版)の完全なバイトコード同一性デコンパイル。
- バージョン: G4BE08 デバッグビルド(2004 年 11 月 25 日プロトタイプ、両ディスク分)。
- 識別方法: すべての関数が
ファイルで特定されています。Bio4.sym - 再現結果: リポジトリを構築することで、以下のファイルと構造を完全再現。
(メインバイナリ)main.dol- 全 114 つの REL オーバーレイ
- 検証済み SHA1:
config/G4BE08/build.sha1
構成要素の統計情報
- オブジェクト (体数)
- 総計:1083 体(DOL 内 675 体、REL 合計 408 体)。
- バイト同一性: すべての体は元のコードと完全に一致。
- 関数数:15,641 つ。
- ソースコード
- C/C++ コード:約 55.5 万行 (
)。src/ - ヘッダーファイル:約 3.3 万行 (
)。include/ - アセンブリファイル: 含まれていません。
- C/C++ コード:約 55.5 万行 (
- ゲームコード
- コンパイラ環境: 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)。
- 配送内容: CRI がライブラリと共にコンパイラを同梱。
- ニンテンドー SDK
- 使用コンパイラ: Metrowerks CodeWarrior GC/1.2.5n。
- ソース元:
から取得。dolsdk2004
アセットとデータについて
- 画像アセット: プロジェクトには一切含まれていません。
- ディスクファイル: 複製されたコードやデータは一切存在しません。
- 必要な作業: デバッグディスクから画像ファイルをコピーする必要があります。
- ディスク 1:
と大半の REL を構築するために必要。main.dol - ディスク 2: 4 つのアイランドステージ用 REL (
~st3_0
) を構築するために必要。st3_3 - 読み込みタイミング: 元ファイルはコンフィギュレーション時にそれらから読み込まれます。
- ディスク 1:
ビルド手順
- 環境要件: Linux、Python 3、ninja。
- ツール群:
,decomp-toolkit
,objdiff
, CodeWarrior ビルド版(wibo
実行時に自動取得)。configure- ※例外:ネイティブの SN GCC は別途構築が必要です。
ステップバイステップ手順
-
ネイティブ cc1/cc1plus の構築
- 対象: SN の GPL ソースドロップ使用。
- 詳細参照先:
tools/sn-gcc/build.sh
export SN_GCC_SRC=/path/to/NGC_GNU_SRC/NGC tools/sn-gcc/build.sh -
ディスク画像の準備
- ディスク 1(
+ 110 の REL)をmain.dol
、ディスク 2 (re4_debug_disc1.iso
..st3_0
) をst3_3
にコピーします。re4_debug_disc2.gcm
cp re4_debug_disc1.iso re4_debug_disc2.gcm orig/G4BE08/ - ディスク 1(
-
ビルドと検証
- 構築コマンド:
python3 configure.py && ninja- 進捗確認:
終了時に DOL および REL モジュールが 100% マッチしリンク済みのレポートが表示されます。ninja - SHA1 検証:
build/tools/dtk shasum -c config/G4BE08/build.sha1- 出力: 115 件の「OK」表示が確認できます。
ユニット単位の比較ツール
- バイト同一性確認:
python3 tools/bytecmp.py game/foo- 対象オブジェクトを元のバイト単位ごとに比較します。
- 関数差分確認:
python3 tools/fdiff.py game/foo <symbol>- 特定の関数の差分を表示します。
リポジトリ構成(レイアウト)
- src/game/
- ゲーム本体(C++、一部の新しい lib C ユニット)。
: 敵キャラクターsrc/em*/
: 武器src/wep*/
: プレイヤーキャラクターsrc/pl*/
: 部屋(各部屋ごとに 1 つの REL)src/st*/
: その他のデータsrc/t_*/
,src/Tools/
: ゲーム内のデバッグエディタsrc/tools/
: サブ画面src/Sscrn/
- src/lib/
- SDK、CRI、ランタイムライブラリ。
- include/
- ヘッダーファイル、再構築された構造体レイアウトを含む。
- config/G4BE08/
- ユニットリスト (
,objects.py
)modules.py - シンボル表 (
), スプリット情報 (symbols.txt
)splits.txt - リンカースクリプト、モジュールごとの REL データ (
)modules/<mod>/ - 検証 SHA1 ファイル (
)build.sha1
- ユニットリスト (
- tools/
- ビルドジェネレーター (
)、ProDG ドライバー (project.py
)ngccc.py - REL 再構築 (
,make_rel.py
)link_rel.py - 比較ツール、sn-gcc/(ネイティブコンパイラビルド)
- research/(コンパイラ分析キット)
+ motion/(アニメーションを glTF/BVH へエクスポートし、Dolphin で検証)motion_export.py
- ビルドジェネレーター (
- docs/
: エンジンの組み立て方およびサブシステム別の読み方ガイド。overview.md
: マッチングの実施方法、コンパイラ系譜、機構カタログ、経験則。matching.md
: 各ユニットに関するメモ。unit-notes.md
: ステップバイステップの研究ロギング記録。research/
「マッチング」の意味と手法
- 完全互換性: すべてのユニットが、元のコンパイラを用いて元のバイトコードに再コンパイルされます。
- 特殊な記述の処理: 自然な C コードでの書き付けが見つからない場合(レジスタ選択やスケジューリングの再現)は、以下のコメントで明記します。
- 例:
// COMPILER-DIFF: - 件数:644 件(デッドテスト、空の
で隠蔽されたもの、アンカー、レジスタ固定asm("")
、パディングステートメントなど)。T x asm("rN") - 特性: これらの記述は一切指令を出力しません。
- 例:
アセンブリテンプレートの検証
- 確認コマンド:
python3 tools/asmcheck.py --all- 全 GCC ユニットをテンプレート付きでコンパイルし、ハードウェアカーネルへの指令ヒットを表示(合計 231 件)。
- 過去の経緯:
- 以前のバージョンではゲームコードに約 100 の手動配置指令 (
など)、CRI ライブラリに約 100 のレジスタ固定ブロックが含まれていましたが、2026 年 9 月 17 日に C コードに置き換えられています。asm("li %0,0") - 詳細レシピは
の「Asm-removal pass」セクションに記載。docs/research/compiler.md
- 以前のバージョンではゲームコードに約 100 の手動配置指令 (
残存アセンブリの扱い
元の著者が他の方法で表現できなかったコードはアセンブリとして記述されています。
- GCC 2.95 ゲームコード
- ペアシンプリアルゴリズムカーネル(math_sub: SINF/COSF/RSQRT/LIMIT_ANGLE, trans, shape, dbmodule, Espgen42/45 の quantised psq_l)。
- main/scheduler の GQR セットアップ。
- libsn sndvd 例外ハンドラ。
- MWCC CRI ライブラリ
- ペアシンプリアルゴリズム / キャッシュ / SPR カーネル(mpv_umc, mpv_mc, dct_fsri, cftyp422_ppc, mpv_lib)。
- SDK の mtx/vec/quat/GX 固有関数。
- dct_ac のレジスタ-steering ブロック (
)。dctac_Init- .vendor ビルド:
をプール化したが、8 バイトリテラルをプール化していなかった。.bss - 我々の処理: 双方をプール化。
- .vendor ビルド:
- 特定のアセンブリ記法:
: コードレスなピン(色セットをレジスタ 1 つ狭める)。{ mr r11, x; mr x, r11 }
: 不透明な自己コピー(27 の場所に残存)。{ mr v, v }
- 8 つのアセンブリ本体ユニット
(__start)、eabi、SN の tealeaf/fileserver/ppcdown/proview (crt0
)、Capcom の memset_2 と yz2asm (src/lib/<name>.c
)。src/game/<name>.cpp- 特性: 元のものがアセンブリ(SN の libsn/crt0 および Capcom 独自の asm)であり、C ファイル内で GAS サムタックスの全体関数トップレベル
本体となっています(asm()
,.globl
, ラベル、.type
,.4byte
など)。.float - 構築: 残りのコードと同じ ProDG ドライバーでコンパイルされます。
- ヘッダー:
がレジスタ名前を供給。include/asm_regs.h
- ヘッダー:
命名規則と構造体定義
- 関数名: デバッグビルドの
ファイルからの Capcom のものを使用。Bio4.sym- C++ マングリングのため、ゲームコードは C++、SDK/CRI/newlib は C です。
- ファイル名・ユニット境界: 二進法に残されたアサーション (
) から決定。D:/Bio4/Prog/<file>.cpp - 構造体およびフィールド名のタイプ:
- ベンダー名: PS2 デバッグビルドの型情報から取得(
でマッチ)。tools/ps2sym.py - 我々のもの: 使用状況から命名し、その旨を明記。
- プレースホルダー
: オフセットは 16 進数、内容は未確認。xNN
- ベンダー名: PS2 デバッグビルドの型情報から取得(
- 表記揺れ: ベンダー名のスペリング維持のため、意図的に異なる表記 Convention を混在させます。
- #line ディレクティブ: アサーション文字列にベンダーの行番号を再現。
- 詳細:
参照。docs/naming.md
コントリビューションとライセンス
- コントリビューションガイド (
):CONTRIBUTING.md- ビルド手順、3 つの検証チェック、ルール(バイトコード変更禁止、指令出力禁止、命名規則)。
- 証拠付きでのリネーム提案方法。
- ライセンス:
- ゲーム/SDK ソース: Capcom, Nintendo, CRI Middleware の知的財産です。
- ビルドスクリプト・ツール・文書: CC0 ライセンス (LICENSE) 下で公開されています。
- 利用目的: 研究および保存のためのみ。