Makefile编译HOST及MSP432平台时链接.o文件报program headers空间不足错误
报错原因
- 你的Makefile没有对链接参数做平台区分,不管是HOST(x86架构)还是MSP432(ARM架构),都强制使用了MSP432专用的
msp432p401r.lds链接脚本。x86平台的ld无法识别ARM架构单片机的内存布局规则,直接导致程序段空间分配失败。 - 即使是MSP432平台,部分版本的arm-none-eabi-ld在链接小型嵌入式程序时,默认的页对齐规则也可能导致程序头空间不足,触发同类报错。
修复步骤
- 调整Makefile的条件分支,将LDFLAGS按平台拆分,HOST平台不加载MSP432的链接脚本,修改后的平台判断部分代码如下:
ifeq ($(PLATFORM),HOST) CC = gcc CFLAGS = -DHOST LD = ld # HOST平台用默认链接规则,不需要指定单片机的lds文件 LDFLAGS = -Wl,-Map=$(TARGET).map else CC = arm-none-eabi-gcc CFLAGS = -DMSP432 -mcpu=$(CPU) -march=$(ARCH) --specs=$(SPECS) -mfloat-abi=hard -mfpu=fpv4-sp-d16 LD = arm-none-eabi-ld # 只有MSP432平台加载对应链接脚本,添加-N参数解决程序头空间不足问题 LDFLAGS = -Wl,-Map=$(TARGET).map -N -T ../msp432p401r.lds endif
记得删除原来全局定义的LDFLAGS = -Wl,-Map=$(TARGET).map -T ../msp432p401r.lds这行代码,避免参数冲突。
执行
make clean清理所有之前编译生成的.o、.out、.map等中间文件,避免旧缓存影响编译结果。重新执行对应平台的编译命令即可正常生成目标文件:
- HOST平台:
make build PLATFORM=HOST - MSP432平台:
make build PLATFORM=MSP432
内容的提问来源于stack exchange,提问作者Hariprasaath R
相关产品推荐
相关产品推荐

