Skip to content

WASM 编译管线

将 Pokemon Emerald 的 C 源代码编译为 WebAssembly,在现代浏览器中运行经典 GBA 游戏——这就是整个编译管线要解决的核心问题。

涵盖内容

模块说明
编译概念Makefile 构建规则、Clang 编译标志、wasm-ld 链接选项
练习动手分析编译流程、对比构建配置
代码走读逐行解读 Makefile 中的 WASM 构建目标

核心概念

本项目使用 Clang 将 Pokemon Emerald 的反编译 C 源代码编译为 WebAssembly 目标文件,再通过 wasm-ld 链接器生成最终的 .wasm 二进制。关键导出函数包括:

  • AgbMain — 游戏主入口,对应原版 GBA 的启动函数
  • WasmRunFrame — 逐帧执行函数,由 JavaScript 在每一帧回调

编译管线的主要阶段:

  1. 预处理:展开 INCGFX / INCBIN 宏,注入 MODERN=1WASM=1 宏定义
  2. 编译:Clang 以 wasm32-unknown-unknown 目标三元组将每个 .c 文件编译为 .wasm.o
  3. 链接:wasm-ld 将所有目标文件链接为单一 .wasm 模块,导出供 JS 调用的函数

前置知识

知识点说明
C 语言编译基础了解预处理、编译、汇编、链接四个阶段
Makefile 基础能够阅读简单的 Makefile 规则
WebAssembly 基础了解 WASM 的基本概念和运行模型

学习路径

下一步GBA 硬件模拟 — 了解 JavaScript 如何模拟 GBA 的硬件寄存器与内存映射。