DevKitPro编译GBA程序起始地址错误,如何配置gcc指定0x08000000?
问题解决方法
观测误区纠正
你当前用objdump查看的是编译阶段生成的.o目标文件,目标文件本身就是未重定位的,地址显示为0x00000000属于正常现象,最终的内存地址是链接生成.elf文件时才会确定的,你之前的验证对象有误。
你的问题核心是Makefile配置错误,导致DevKitPro预设的GBA链接规则没有生效,按以下步骤修改即可:
1. 修复CFLAGS覆盖问题
你原Makefile中先定义了带架构、优化参数的CFLAGS,后续又用:=直接赋值覆盖了所有原有配置,导致编译参数丢失:
原错误配置:
CFLAGS := $(INCLUDE)
修改为追加模式:
CFLAGS += $(INCLUDE)
2. 链接参数中加入GBA专用specs
你已经定义了SPECS := -specs=gba.specs,但没有将该参数加入LDFLAGS中。gba.specs是DevKitPro官方提供的GBA链接配置,内部已经预设了ROM基地址为0x08000000,不需要手动编写链接脚本。
原错误LDFLAGS配置:
LDFLAGS = -g $(ARCH) $(INCLUDE) -Wl,-Map,$(notdir $@.map)
修改为加入SPECS参数:
LDFLAGS = -g $(ARCH) $(SPECS) $(INCLUDE) -Wl,-Map,$(notdir $@.map)
3. 验证修改结果
重新执行make编译后,对最终生成的PaintBoyAdvance.elf执行objdump查看段地址:
arm-none-eabi-objdump -h PaintBoyAdvance.elf
此时.text段的VMA地址会显示为0x08000000开头,符合GBA卡带的地址要求。
额外优化建议
你当前代码中直接#include "bitmap.c"是错误的用法,应该将bitmap.c放到项目的source目录下,由Makefile自动编译链接,避免后续出现符号重复定义的问题。
内容的提问来源于stack exchange,提问作者puppydrum64
相关产品推荐
相关产品推荐

