高版本GNU LD无法将ELF作为链接输入的32位操作系统构建问题
报错根因
GNU LD 自2.36版本开始新增输入文件类型强校验,默认禁止将已经完成链接的可执行ELF文件作为输入参与链接。你当前的构建流程中需要将已链接完成的build/bootloader/loader.elf和loader.o做二次链接,触发了高版本LD的校验规则,所以抛出报错。
解决方案
方案1:调整链接流程,取消二次链接(推荐,全版本兼容)
你当前的二次链接逻辑可以合并为一次链接,完全规避校验问题,修改Makefile如下:
- 删除原有
build/bootloader/loader.elf的生成规则 - 修改
loader_full.elf的生成规则,直接关联所有依赖的目标文件:
# 链接第一、第二阶段引导所有目标文件,直接生成loader_full.elf build/bootloader/loader_full.elf: build/bootloader/loader.o build/bootloader/loader_2.o build/drivers/*.o ${LD} -T ld/loader.ld $^ -o $@ rm build/bootloader/loader_2.o
该方案符合常规链接逻辑,不会产生额外兼容性问题。
方案2:添加LD参数绕过校验(临时兼容用)
如果不想改动现有构建流程,可直接给高版本LD添加--allow-link-executable参数,强制允许可执行文件作为链接输入:
build/bootloader/loader_full.elf: build/bootloader/loader.o build/bootloader/loader.elf ${LD} --allow-link-executable -T ld/loader.ld $^ -o $@
该参数仅绕过校验规则,不会改变原有链接生成的文件内容。
验证方式
修改完成后执行make clean && make重新构建即可。
内容的提问来源于stack exchange,提问作者zer0flag
相关产品推荐
相关产品推荐

