繁体   English   中英

在相同的 docker 中运行构建(gcc、make、cmake),来自相同的源会给出具有不同哈希值的二进制文件

[英]Running builds (gcc, make, cmake) inside identical docker, from same source gives binaries with different hashes

我遇到了“有趣”的问题。 我正在为我们的 Bamboo 项目进行构建自动化。 我很确定我已经完成了,然后有人问:为什么周五晚上和周六晚上的构建(没有代码更改)不同? 我有 2 个远程构建器。 两者都安装了相同的操作系统(Ubuntu)并同时更新到最新版本。 两者都安装了相同的库。 编译在 docker 内(从同一来源导入的图像)所以我开始研究这个并达到了可以观察以下内容的地步:

  • 在同一台机器上从同一源运行编译两次,为每个编译启动新的 docker 会产生相同的(根据 sha1sum)二进制文件。
  • 在两台不同的机器上从相同的源代码运行两次编译,产生不同的二进制文件。 源在同名文件夹中,它也安装在同名路径上的 docker 中。
  • 在具有某些硬件规范的 1 台 PC 上运行编译,然后取出磁盘并将其连接到不同的 PC(具有不同的硬件规范)并再次从同一源运行编译。 生成的二进制文件是相同的。

代码是否可能以某种方式依赖于确切的操作系统映像? 或任何其他操作系统属性? 还有什么想法吗?

有追鬼的感觉……

编辑:在逐步尝试 go 之后,我将其缩小到 cmake。 这意味着:在两台不同机器上制造的 cmake 不同(现在开始 1-by-1 差异)。 如果我把几台机器的 cmake 的结果并从那里用 make 编译,我总是得到相同的二进制文件。 所以我认为问题在于编写 cmakefile 的方式而不是编译本身。

EDIT2:我现在知道这是 Qt 5.2.1 rcc 是非确定性问题。 在 cmake 期间运行 rcc 并计算一些哈希值。 这些哈希的差异是导致整个事情不确定的原因。 如果我执行 cmake 并将其内容带到 3 台不同的机器上并运行编译(make),我得到 100% 相同的结果(根据 sha1sum)。 我认为这就解决了。 现在我需要说服项目升级到更新版本的 Qt,我知道如何使 rcc 确定性,或者我需要找到如何在 5.2.1 中使 rcc 确定性。

如果您从相同的操作系统映像开始,那么您的测试表明映像后配置步骤引入了更改。 查看该配置。 一个简单的例子是主机名。 我会区分任何中间构建工件,例如 config.h 或任何 cmake 写入其 output。 尝试在两个二进制文件(不同的)上运行字符串,然后比较 output 看看你是否学到了一些东西。

https://tests.reproducible-builds.org/debian/index_issues.html也可能很有启发性。

结果可能是巧合。 链接要求将所有需要的函数 go 放入可执行文件中,但顺序一般不受限制。 这很可能取决于 object 文件出现在磁盘上的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM