[英]Is it possible to force say, `gcc`, to produce identical binaries for identical pieces of source code in C and C++?
[英]Running builds (gcc, make, cmake) inside identical docker, from same source gives binaries with different hashes
我遇到了“有趣”的问题。 我正在为我们的 Bamboo 项目进行构建自动化。 我很确定我已经完成了,然后有人问:为什么周五晚上和周六晚上的构建(没有代码更改)不同? 我有 2 个远程构建器。 两者都安装了相同的操作系统(Ubuntu)并同时更新到最新版本。 两者都安装了相同的库。 编译在 docker 内(从同一来源导入的图像)所以我开始研究这个并达到了可以观察以下内容的地步:
代码是否可能以某种方式依赖于确切的操作系统映像? 或任何其他操作系统属性? 还有什么想法吗?
有追鬼的感觉……
编辑:在逐步尝试 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.