You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建U-boot时已编译定义未链接的undefined reference错误如何解决

问题1:common/spl目录下的源码未编译的原因

U-Boot的主程序与SPL(Secondary Program Loader)采用完全独立的编译上下文,二者的配置、编译产物完全隔离:

  • 你看到的common/Makefile中obj-y += spl/是通用规则,但common/spl/下的子Makefile通常会依赖CONFIG_SPL_*系列配置(比如CONFIG_SPL_FRAMEWORK)才会将源码加入编译目标,未开启对应配置时,子目录不会生成任何编译产物。
  • SPL的所有编译产物都会输出到独立的spl/目录下,你在链接命令中看到的common/spl/built-in.o是相对于spl/工作目录的路径,对应实际文件为spl/common/spl/built-in.o,而非源码目录下的common/spl/产物。

问题2:common/built-in.o未加入SPL链接流程的原因

  • 根目录下的common/built-in.o是U-Boot主程序的编译产物,编译时未携带CONFIG_SPL_BUILD宏,从设计上就不会参与SPL的链接。
  • SPL需要使用的公共代码会单独在spl/common/目录下编译生成对应目标,而U-Boot默认不会把整个common/目录加入SPL的编译遍历列表:从你贴出的链接命令也可以看到,SPL仅引入了common/spl/built-in.o、common/init/built-in.o两个common子目录的产物,根本没有包含common/built-in.o的规则,因此你在主程序common/built-in.o中看到的mem_malloc_init符号自然不会被SPL识别。

快速解决方案

你遇到的mem_malloc_init未定义问题属于SPL编译的典型场景,不需要手动修改Makefile:直接在SPL配置中开启CONFIG_SPL_MALLOC=y,编译系统会自动将malloc相关实现加入SPL的编译与链接流程,同时保留CONFIG_SYS_SPL_MALLOC_START配置即可保留完整功能。

内容的提问来源于stack exchange,提问作者Chan Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:45:04