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
相关产品推荐
相关产品推荐

