Yocto构建部分二进制MD5值随编译路径变化的问题排查求助
执行摘要:Yocto镜像构建的部分二进制文件(如canbus-handler)MD5值随编译路径变化,但极简项目(如helloyoctoworld)不受路径影响,经排查发现是nlohmann/json.hpp将自身头文件路径嵌入二进制导致。
问题背景
使用TI提供的Yocto平台构建产品镜像,已接入多个自有软件项目作为附加层,运行状态正常。近期发现部分辅助程序(如canbus-handler)在不同编译路径下生成的二进制MD5校验值存在差异。
对比测试结果
canbus-handler的MD5路径差异
在/tmp/Project-xxxxx_Yocto路径构建的结果:
user@MACHINE:/tmp/Project-xxxxx_Yocto$ md5sum ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/canbus-handler/git+AUTOINC+b99a8424b6-r0/packages-split/canbus-handler/usr/bin/canbus-handler 4f1b270a374c14bcd95d093095f4354d ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/canbus-handler/git+AUTOINC+b99a8424b6-r0/packages-split/canbus-handler/usr/bin/canbus-handler
在~/repos/Project-xxxxx_Yocto路径构建的结果:
user@MACHINE:~/repos/Project-xxxxx_Yocto$ md5sum ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/canbus-handler/git+AUTOINC+b99a8424b6-r0/packages-split/canbus-handler/usr/bin/canbus-handler db35646094dc2f05022e012666973d7f ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/canbus-handler/git+AUTOINC+b99a8424b6-r0/packages-split/canbus-handler/usr/bin/canbus-handler
MD5值对比:4f1b270a374c14bcd95d093095f4354d vs db35646094dc2f05022e012666973d7f
极简项目helloyoctoworld的稳定MD5
在两个路径构建后,二进制MD5值始终一致:
user@MACHINE:/tmp/Project-xxxxx_Yocto$ md5sum ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/helloyoctoworld/git+AUTOINC+6716589062-r0/packages-split/helloyoctoworld/usr/bin/helloyoctoworld 40ae08fc09eb08ef8f519ee9312659c9 ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/helloyoctoworld/git+AUTOINC+6716589062-r0/packages-split/helloyoctoworld/usr/bin/helloyoctoworld
user@MACHINE:~/repos/Project-xxxxx_Yocto$ md5sum ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/helloyoctoworld/git+AUTOINC+6716589062-r0/packages-split/helloyoctoworld/usr/bin/helloyoctoworld 40ae08fc09eb08ef8f519ee9312659c9 ./workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/helloyoctoworld/git+AUTOINC+6716589062-r0/packages-split/helloyoctoworld/usr/bin/helloyoctoworld
MD5值对比:40ae08fc09eb08ef8f519ee9312659c9 vs 40ae08fc09eb08ef8f519ee9312659c9
排查过程
编辑1:二进制内容差异分析
对两个路径生成的canbus-handler二进制执行strings+diff操作,发现差异来自nlohmann/json.hpp的路径:
< /tmp/Project-xxxxx_Yocto/workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/canbus-handler/git+AUTOINC+deffada7ed-r0/recipe-sysroot/usr/include/nlohmann/json.hpp --- > /home/USER/repos/Project-xxxxx_Yocto/workdir/arago-tmp-default-glibc/work/armv7at2hf-neon-oe-linux-gnueabi/canbus-handler/git+AUTOINC+deffada7ed-r0/recipe-sysroot/usr/include/nlohmann/json.hpp
即使不通过Yocto,直接在主机用make命令本地编译,该路径也会被嵌入二进制:
cannot use operator[] with /usr/include/nlohmann/json.hpp m_object != nullptr
编辑2:独立项目验证
创建独立测试项目验证,编译后用strings检查二进制,确认头文件路径确实被嵌入:
janne@shell:/tmp$ git clone git@github.com:usvi/nlohmannjsontest.git Cloning into 'nlohmannjsontest'... remote: Enumerating objects: 18, done. remote: Counting objects: 100% (18/18), done. remote: Compressing objects: 100% (14/14), done. remote: Total 18 (delta 2), reused 18 (delta 2), pack-reused 0 (from 0) Receiving objects: 100% (18/18), 204.74 KiB | 605.00 KiB/s, done. Resolving deltas: 100% (2/2), done. janne@shell:/tmp$ cd nlohmannjsontest/ janne@shell:/tmp/nlohmannjsontest$ make g++ -I inc -Wno-deprecated -c -o main_3.11.3.o src/main_3.11.3.cpp g++ main_3.11.3.o -o main_3.11.3 g++ -I inc -Wno-deprecated -c -o main_2.1.1.o src/main_2.1.1.cpp g++ main_2.1.1.o -o main_2.1.1 strip main_3.11.3 strip main_2.1.1 strings main_3.11.3 | grep "json.hpp" inc/nlohmann3.11.3/json.hpp strings main_2.1.1 | grep "json.hpp" inc/nlohmann2.1.1/json.hpp
解决方法需求
已明确问题源于nlohmann/json.hpp将头文件路径嵌入二进制,现寻求具体解决方法,消除编译路径对二进制MD5值的影响。
内容的提问来源于stack exchange,提问作者Janne Paalijarvi

