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

问题描述 投票:0回答:3

我在一个非常规范的环境中工作,我们需要能够生成相同的二进制输入,每次构建产品时都提供相同的源代码。我们目前使用的是 g++ 的一个古老版本,该版本已被修补,不会在生成的二进制文件中写入任何日期/时间之类的东西,这些二进制文件会随着构建的不同而发生变化,但我想更新到 g++ 4.7.2。有谁知道补丁,或者对我需要寻找什么来获取两段相同的源代码并产生相同的二进制输出有什么建议吗?

c++ g++ deterministic
3个回答
17
投票

Debian Reproducible 构建项目 尝试逐字节标准化 Debian 软件包,并在 2016 年获得了 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
选项,它可能会在包级别上提供一些想法,但目前还远未完成。

相关主题:


8
投票

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

除了设置

PWD=/proc/self/cwd
和使用
-frandom-seed=<input-file-name>
外,还有一些补丁,可以在
svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7
分支中找到。


-1
投票

使用“DATE”宏使构建具有不确定性

© www.soinside.com 2019 - 2024. All rights reserved.