Appearance
WASM 编译管线
将 Pokemon Emerald 的 C 源代码编译为 WebAssembly,在现代浏览器中运行经典 GBA 游戏——这就是整个编译管线要解决的核心问题。
涵盖内容
| 模块 | 说明 |
|---|---|
| 编译概念 | Makefile 构建规则、Clang 编译标志、wasm-ld 链接选项 |
| 练习 | 动手分析编译流程、对比构建配置 |
| 代码走读 | 逐行解读 Makefile 中的 WASM 构建目标 |
核心概念
本项目使用 Clang 将 Pokemon Emerald 的反编译 C 源代码编译为 WebAssembly 目标文件,再通过 wasm-ld 链接器生成最终的 .wasm 二进制。关键导出函数包括:
- AgbMain — 游戏主入口,对应原版 GBA 的启动函数
- WasmRunFrame — 逐帧执行函数,由 JavaScript 在每一帧回调
编译管线的主要阶段:
- 预处理:展开
INCGFX/INCBIN宏,注入MODERN=1和WASM=1宏定义 - 编译:Clang 以
wasm32-unknown-unknown目标三元组将每个.c文件编译为.wasm.o - 链接:wasm-ld 将所有目标文件链接为单一
.wasm模块,导出供 JS 调用的函数
前置知识
| 知识点 | 说明 |
|---|---|
| C 语言编译基础 | 了解预处理、编译、汇编、链接四个阶段 |
| Makefile 基础 | 能够阅读简单的 Makefile 规则 |
| WebAssembly 基础 | 了解 WASM 的基本概念和运行模型 |
学习路径
下一步:GBA 硬件模拟 — 了解 JavaScript 如何模拟 GBA 的硬件寄存器与内存映射。