Appearance
devkitARM
是什么
devkitARM 是 devkitPro 项目提供的 GBA/NDS/3DS 等ARM平台交叉编译工具链。它基于 GNU 工具链(GCC、binutils、gdb 等),目标是 arm-none-eabi(无操作系统的 ARM 裸机环境)。在 pret 反编译项目中,devkitARM 是原始 GBA 构建路径使用的标准工具链。
为什么需要
devkitARM 在 GBA 开发社区中扮演着核心角色:
- 标准工具链:pret 项目(包括 pokeemerald)使用 devkitARM 作为推荐的编译工具链。
- GBA 专用支持:提供了针对 GBA 硬件的头文件、链接脚本和启动代码。
- INCGFX 宏支持:devkitARM 的工具链支持 INCGFX/INCBIN 等资源嵌入宏。
- 链接脚本:提供了 GBA 内存布局的链接脚本,确保代码和数据被放置在正确的地址。
在 pokeemerald-wasm 项目中,devkitARM 用于原始 GBA ROM 的构建路径,而 Wasm 构建路径则使用 Clang 替代。
原理与实现
主要工具
devkitARM 工具链包含以下核心工具:
| 工具 | 说明 |
|---|---|
arm-none-eabi-gcc | C/C++ 编译器,将源码编译为 ARM 机器码 |
arm-none-eabi-as | 汇编器,将 ARM/Thumb 汇编代码汇编为目标文件 |
arm-none-eabi-ld | 链接器,将目标文件链接为 ELF 可执行文件 |
arm-none-eabi-objcopy | 格式转换工具,将 ELF 转换为 GBA 的二进制 ROM 格式 |
arm-none-eabi-objdump | 反汇编和检查工具 |
arm-none-eabi-gdb | 调试器 |
构建流程(GBA 原始路径)
使用 devkitARM 构建 GBA ROM 的典型流程:
- 预处理:处理 C 源文件中的预处理指令和宏(包括 INCGFX/INCBIN)。
- 编译:
arm-none-eabi-gcc将.c文件编译为.o目标文件,使用-mthumb等选项生成 Thumb 指令。 - 汇编:
arm-none-eabi-as将.s汇编文件汇编为.o目标文件。 - 链接:
arm-none-eabi-ld使用 GBA 专用链接脚本将所有.o文件链接为 ELF 文件。 - 格式转换:
arm-none-eabi-objcopy将 ELF 文件转换为原始的二进制 ROM 文件(.gba)。 - 修正:可选地使用
gbafix工具修复 ROM 头部信息。
编译选项
GBA 编译常用的 GCC 选项:
-mthumb:生成 Thumb 指令(16 位,代码更紧凑)。-mthumb-interwork:支持 ARM/Thumb 混合调用。-O2或-Os:优化级别。-ffunction-sections -fdata-sections:将函数和数据放入独立段,便于链接器优化。
在 pokeemerald-wasm 中的实现
在 pokeemerald-wasm 项目中,devkitARM 的角色如下:
- 原始 GBA 构建路径:执行
make或make modern时,仍然使用 devkitARM 工具链构建标准的.gbaROM 文件。这条路径用于验证反编译代码的正确性。 - Wasm 构建路径:执行 Wasm 构建时,devkitARM 被 Clang + wasm-ld 替代:
arm-none-eabi-gcc→clang --target=wasm32arm-none-eabi-ld→wasm-ldarm-none-eabi-objcopy→generate_wasm_assets.py(Python 脚本替代资源处理)
- 兼容性:项目的 Makefile 同时支持两条构建路径,通过不同的 Make 目标选择使用哪种工具链。
相关概念
- pret — 使用 devkitARM 构建的 Pokémon 反编译项目
- INCGFX / INCBIN — devkitARM 支持的资源嵌入宏