问题 如何用g ++生成确定性二进制输出?


我在一个非常规范的环境中工作,我们需要能够生成相同的二进制输入,每次都可以为构建产品提供相同的源代码。我们目前使用的古老版本的g ++已被修补,不会在生成的二进制文件中写入任何类似日期/时间的内容,这些日期/时间会从构建更改为构建,但我想更新为g ++ 4.7.2。有没有人知道一个补丁,或者有什么建议我需要寻找两个相同的源代码并产生相同的二进制输出?


12297
2018-02-01 19:46


起源



答案:


我们还依赖于位相同的重建,并使用gcc-4.7.x.

除了设置 PWD=/proc/self/cwd 和使用 -frandom-seed=<input-file-name>,有一些补丁,可以找到 svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7 科。


7
2018-02-02 02:40



PWD = / proc / self / cwd做什么? - Steven Behnke
@StevenBehnke我们用调试信息构建。在Linux上,GCC记录 PWD (shell设置为当前工作目录)作为当前编译目录。因为无论构建执行的目录是什么,我们都希望构建是相同的,我们设置 PWD 可预测的价值。 - Employed Russian
GCC中随机性的主要应用是什么? - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


我们还依赖于位相同的重建,并使用gcc-4.7.x.

除了设置 PWD=/proc/self/cwd 和使用 -frandom-seed=<input-file-name>,有一些补丁,可以找到 svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7 科。


7
2018-02-02 02:40



PWD = / proc / self / cwd做什么? - Steven Behnke
@StevenBehnke我们用调试信息构建。在Linux上,GCC记录 PWD (shell设置为当前工作目录)作为当前编译目录。因为无论构建执行的目录是什么,我们都希望构建是相同的,我们设置 PWD 可预测的价值。 - Employed Russian
GCC中随机性的主要应用是什么? - Ciro Santilli 新疆改造中心 六四事件 法轮功


Debian 可重复的构建项目 尝试逐字节地标准化Debian软件包,最近得到了一个 Linux基金会资助

虽然这可能不仅仅包括编译,你应该看看它。

它也指出了我 本文,它为@Employed所说的添加了以下几点:

  • 将源放在固定文件夹中(例如 /tmp/build)处理 __FILE__
  • 对于 __DATE____TIME____TIMESTAMP__
    • libfaketime: https://github.com/wolfcw/libfaketime
    • 用。覆盖那些宏 -D
    • -Wdate-time 要么 -Werror=date-time:警告或失败,如果有的话 __TIME____DATE__ 要么 __TIMESTAMP__ 被使用。 Linux内核4.4默认使用它。
  • 使用 D 国旗与 ar,或使用 https://github.com/nh2/ar-timestamp-wiper/tree/master 擦拭邮票
  • -fno-guess-branch-probability较旧的手动版本 说它是非决定论的来源,但是 不再。不确定是否涵盖了这一点 -frandom-seed 或不。

Buildroot里面 有一个 BR2_REPRODUCIBLE 选项可能会在包级别上提供一些想法,但目前还远未完成。

相关主题:


7
2018-06-24 06:36





使用''日期'宏使构建不确定


0
2018-06-20 02:19



你好,这是不同的 __DATE__ 我提过了吗? stackoverflow.com/a/31019307/895245 - Ciro Santilli 新疆改造中心 六四事件 法轮功