Buildroot未用-@选项编译设备树,U-Boot应用Overlay报错
问题:Buildroot 2022.11编译Radxa Zero设备树未生成/__symbols__节点,导致Overlay应用失败
背景
使用Buildroot 2022.11为Radxa Zero构建镜像,需要自行编写设备树Overlay以激活ttyAML0和PWM_C。已开启BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT=y选项,但编译出的基础DTB未包含/__symbols__节点,导致U-Boot执行fdt apply ${dto_addr}时报错:
failed on fdt_overlay_apply(): FDT_ERR_BADSTRUCTURE base fdt does did not have a /__symbols__ node make sure you've compiled with -@
使用DietPi预编译的DTB时Overlay可正常工作,且已尝试make clean全量重建镜像,问题依旧。
排查与解决步骤
启用内核符号节点配置
基础DTB生成/__symbols__节点的前提是内核开启CONFIG_OF_SYMBOL=y,该配置会让dtc自动添加-@编译参数:- 进入Buildroot内核配置界面:
make linux-menuconfig - 找到路径
Device Drivers -> Generic Driver Options -> Device Tree and Open Firmware support -> Maintain symbol table for exported symbols,确保该选项被勾选 - 保存配置后重新编译内核与DTB
- 进入Buildroot内核配置界面:
验证Buildroot的DTB编译参数
若BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT=y未正确传递-@参数到dtc,可手动检查并修正:- 进入Buildroot输出目录下的
build/linux-<内核版本>/arch/arm64/boot/dts/amlogic - 执行
make V=1 meson-g12a-radxa-zero.dtb,查看输出中的dtc命令是否包含-@ - 若未包含,直接修改Buildroot的
package/linux/linux.mk,在DTC_FLAGS相关行添加参数:DTC_FLAGS += -@
- 进入Buildroot输出目录下的
确认基础DTB的正确指定
确保Buildroot正确指向Radxa Zero的基础DTB:- 检查
BR2_LINUX_KERNEL_INTREE_DTS_NAME是否设置为amlogic/meson-g12a-radxa-zero(对应内核源码中的路径) - 若是自定义DTB,需确保编译时同样添加
-@参数
- 检查
检查Overlay的编译配置
- 确认
BR2_LINUX_KERNEL_DTB_OVERLAYS已正确指定你的ttyAML0和PWM_C的Overlay文件路径(如path/to/ttyaml0-overlay.dts path/to/pwm-c-overlay.dts) - 验证Overlay的.dts文件语法无错误,避免因编译失败导致功能异常
- 确认
对比DietPi的内核与DTB差异
若以上步骤无效,可对比DietPi使用的内核版本与Buildroot内核版本,查看DietPi是否有额外patch处理DTB符号节点,或其dtc编译参数有特殊设置,将对应配置或patch移植到你的Buildroot项目中
内容的提问来源于stack exchange,提问作者mister_kanister
相关产品推荐
相关产品推荐

