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

Yocto编译U-Boot2020.07报xxd缺失 自定义默认环境为空问题

问题根因

1. 初始xxd: not found报错原因

Yocto构建采用隔离的主机工具sysroot,不会直接调用宿主机上已安装的软件包。xxd工具由vim-common包提供,手动编译时宿主机预装了该包,因此命令可正常执行;但Yocto的U-Boot recipe默认没有声明对vim-common-native的依赖,构建sysroot中不存在xxd命令,因此触发报错。

2. 网上修改方案导致环境变量为空的原因

该修改方案存在两个核心问题:

  • 没有真正解决xxd缺失的问题:方案中仍然调用了xxd -i,当构建环境不存在xxd时,该命令执行失败无任何输出,管道后续的sed命令也接收不到有效内容,最终生成的环境数组仅包含最后echo的0x00终止符,对应空的环境块,因此U-Boot启动后读不到任何自定义环境变量。
  • 语法逻辑错误:方案中sed的替换规则没有正确适配xxd的输出格式,就算xxd存在,也可能破坏C数组的语法结构,导致环境数据解析异常。

补充说明:原始Makefile的逻辑是将文本格式的环境变量文件,处理为U-Boot要求的存储格式:每个key=value条目后接\0分隔符,整个环境块末尾额外加一个\0作为结束标记,再通过十六进制转换工具生成可被C代码直接引用的字节数组。


正确解决方式

方案一(推荐,无代码修改)

直接补全Yocto构建依赖,不需要修改U-Boot任何源码,编译效果和手动编译完全一致:
在对应的U-Boot recipe(或自定义的bbappend文件)中添加原生依赖:

DEPENDS += "vim-common-native"

添加后Yocto会自动构建native版本的vim-common,将xxd放入构建sysroot,Makefile可正常找到命令,编译出的固件自定义环境变量可正常生效。

方案二(无xxd依赖的Makefile修正)

如果因特殊原因不能引入vim-common依赖,可以将xxd替换为系统默认存在的od工具实现相同的十六进制转换功能,修正后的filechk_defaultenv.h定义如下:

define filechk_defaultenv.h
	(grep -v '^#' | \
	 grep -v '^$$' | \
	 tr '\n' '\0' | \
	 sed -e 's/\\\x0\s*//g' | \
	 od -An -tx1 | tr ' \n' ', ' | sed 's/,$//' ; echo ", 0x00" ; )
endef

该写法不依赖xxd,直接通过coreutils包中默认存在的od命令完成十六进制转换,正确追加末尾的0x00终止符,生成的C数组格式完全符合U-Boot的要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:57:28