为什么我的应用程序在我的 yocto 构建服务器上的大小与安装在目标上的大小不同?

Why is my app a different size on my yocto build server compared to what is installed on target?

我正在使用 Yocto 为嵌入式项目创建自定义 linux 图像。我最近发现了一些东西 st运行ge 并且我无法解决这个问题。图像中包含的应用程序之一是自定义软件,我们称该应用程序为 foo。在 yocto 构建服务器上成功构建后,可以在 tmp/work/armv7at2hf-neon-fslc-linux-gnueabi/foo/1.0.0-[=43= 中找到构建的交叉编译的 foo 可执行文件]目录。 foo 可执行文件(使用 ls -al 获得)在构建服务器上的大小为 40978880 字节。

通过使用生成的映像 tar.gz 文件闪存 SD 卡,映像可以 运行 在目标硬件上。在刷新 SD 卡并在目标上启动映像后,我导航到安装了 foo 的目录。在目标上,我再次使用 ls -al 获取可执行文件的大小,我发现 foo 可执行文件的大小已经缩小为 38585152 字节。尽管可执行文件的大小缩小了,但应用程序运行良好。

这种大小变化是不可接受的,因为它使我无法在应用程序启动过程中对 foo 可执行文件进行 sha256 验证。验证失败,因为构建服务器上的 foo foo 可执行文件的 foo 不是逐字节相同的 安装在目标上。大小差异让我感到困惑。特别是因为我的层安装在 rootfs 上的所有其他文件在构建服务器和目标上都具有相同的大小。

是什么导致了 foo 可执行文件的大小差异?

您没有比较可部署的工件,可部署的二进制文件位于 packages-split/ 目录中。 do_compile 完成后,二进制文件包含调试信息和符号,通常用于调试而不是 运行。因此还有一些额外的步骤需要执行,其中之一是将其安装到暂存区,该暂存区将是配方 workdir 中的 image/ 目录。然后 do_package 任务会将 image/ 中的文件分成 packages-split 中的输出包( ipks/rpms ) 文件夹,在 运行 剥离操作以确保调试信息和符号被打包到调试包中之后,最终的二进制文件在 packages-split/<PN> 中 它将在与目标相同的路径下,如 /usr/bin 它将在 packages-split/<name>/usr/bin 中,这是你应该校验和的二进制文件