我在一个非常受监管的环境中工作,在这里我们需要能够根据同一份源代码每次构建产品时生成完全相同的二进制输入。目前我们使用的是一个古老版本的g++,已经被修补程序修改,以便在结果二进制文件中不写入日期/时间之类的任何东西,以免从构建到构建发生变化,但我想更新到g++ 4.7.2。有人知道是否有相应的修补程序,或者有什么建议可以让我找到如何获取相同源代码并生成相同的二进制输出的方法吗?
我在一个非常受监管的环境中工作,在这里我们需要能够根据同一份源代码每次构建产品时生成完全相同的二进制输入。目前我们使用的是一个古老版本的g++,已经被修补程序修改,以便在结果二进制文件中不写入日期/时间之类的任何东西,以免从构建到构建发生变化,但我想更新到g++ 4.7.2。有人知道是否有相应的修补程序,或者有什么建议可以让我找到如何获取相同源代码并生成相同的二进制输出的方法吗?
Debian的可重复构建项目试图逐字节标准化Debian软件包,并在2016年获得了Linux基金会的资助。
虽然这可能不仅仅包括编译,但你应该看一下它。
它还指向了这篇文章,该文章补充了@Employed所说的以下要点:
/tmp/build
),以处理__FILE__
__DATE__
、__TIME__
、__TIMESTAMP__
:
-D
覆盖这些宏-Wdate-time
或-Werror=date-time
:如果使用了__TIME__
、__DATE__
或__TIMESTAMP__
则警告或失败。Linux内核4.4默认使用此选项。ar
时使用D
标志,或使用https://github.com/nh2/ar-timestamp-wiper/tree/master清除时间戳-fno-guess-branch-probability
:旧版本手册指出它是不确定性的来源,但现在不再是。不确定是否被-frandom-seed
覆盖。Buildroot有一个BR2_REPRODUCIBLE
选项,可能对包级别提供一些思路,但目前还远未完善。
相关主题:
PWD
(由shell设置为当前工作目录)记录为当前编译目录。由于我们希望无论在哪个目录中执行构建,都能产生完全相同的构建结果,因此我们将PWD
设置为可预测的值。 - Employed Russian使用'DATE'宏会使构建过程不确定性
__DATE__
有区别吗?https://dev59.com/CWUq5IYBdhLWcg3wQ-NF#31019307 - Ciro Santilli OurBigBook.com
__DATE__
、__TIME__
或__TIMESTAMP__
的情况下才能知道编译源代码的日期。更具体的问题请参考:https://dev59.com/O4nca4cB1Zd3GeqP80c3 - Ciro Santilli OurBigBook.com