为何bb类文件未加--strip选项,install仍剥离二进制文件?
问题场景
我的.bb文件中包含如下代码:
do_install_append() { install -d "${D}${systemd_system_unitdir}" sed -e "s:@bindir@:${bindir}:" -e "s:@datadir@:${datadir}:" \ "${WORKDIR}/${BPN}_everest.service" \ >"${D}${systemd_system_unitdir}/${BPN}.service" bbwarn "Creating folder: ${D}/${bindir} using workdir: ${WORKDIR}" install -d "${D}${bindir}" install -m 755 "${WORKDIR}/Linux_Daemon_ITS_V4_0_0_0_arm64" "${D}${bindir}" }
其中ITS工具二进制文件已被剥离,导致构建失败并抛出"already-stripped"错误。我已添加INSANE_SKIP_${PN}_append = "already-stripped"规避问题,但核心疑问是:为何未显式指定--strip选项的install命令,会引发剥离相关的错误?
原因分析
Yocto环境中的
install是包装后的命令
Yocto构建环境里的install并非系统原生命令,而是OE-Core提供的包装脚本(通过oe-run-native调用)。这个包装脚本会自动读取Yocto的全局构建配置,比如当STRIP变量已配置、或DEBUG_BUILD设为false时,会自动给install添加--strip参数,哪怕你在recipe里没写这个选项。二进制文件本身已提前被剥离
你从${WORKDIR}中复制的Linux_Daemon_ITS_V4_0_0_0_arm64可能在进入构建环境前就已经是剥离状态(比如上游提供的预编译二进制本身就是stripped版本)。Yocto的sanity check会扫描安装到${D}目录的文件,一旦发现文件已经被剥离,就会抛出"already-stripped"错误——这个错误和install命令无关,是文件本身的状态导致的。继承的bbclass会自动执行剥离任务
你的recipe大概率继承了base.bbclass这类基础类,其中包含do_strip任务。这个任务会在do_install之后自动对${D}目录下的所有二进制文件执行剥离操作。哪怕你用install时没加--strip,后续的do_strip任务仍会尝试处理该文件;如果文件已经被剥离,就会触发冲突报错。
内容的提问来源于stack exchange,提问作者Tom Orsi

