【问题标题】:Repeatable object code generation c++可重复的目标代码生成 C++
【发布时间】:2009-02-24 12:35:55
【问题描述】:

当我使用 c++ 编译器构建项目时,如果源代码没有变化,我能否确保生成的二进制文件不受影响?看起来每次我重新编译我的源代码时,二进制文件的 md5 校验和都会受到影响。编译时间是否会以某种方式影响生成的二进制文件?如何生成可重复的编译结果?

【问题讨论】:

  • 也许您需要一种更好的方法来跟踪除 md5 二进制文件之外的版本?

标签: c++ binary-reproducibility


【解决方案1】:

可以反汇编二进制文件并在输出上运行 md5

MacOSX 上的示例

otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220

但是,一个人错过了全局数据...(也可能是一个参数)

我正在回答 md5 检查二进制文件的问题...您如何像其他人所写的那样管理您的源代码和构建系统也是一个值得关注的问题

【讨论】:

    【解决方案2】:

    我怀疑这在很大程度上取决于您的工具链和操作系统。例如,如果其中一个可执行标头包含时间戳,那么您总是会发现生成的 MD5 是不同的。

    你想要达到的最终结果是什么(即为什么它们相同如此重要)..?

    【讨论】:

    • 我主要在 Visual Studio 和 Xcode/gcc 上寻找答案。我们每天都在重建我们的产品。我想可靠地找出两个版本之间的 dll 发生了哪些变化。我可以通过在编译器/链接器中设置一些标志以在生成二进制文件时不使用时间戳信息来做到这一点吗?
    【解决方案3】:

    您不能对 Visual Studio 进行 md5 校验和比较。对于来自 Visual Studio 的普通发行版 .exe 文件,每次重新编译都会有 3 个位置发生变化。其中两个是时间戳,第三个是唯一的 GUID,Visual Studio 使用它来匹配 .exe 的版本和帮助文件以确保它们同步。

    也许可以编写一个工具将 3 个变化的字段归零,但我不确定解析文件是否容易。

    另外,如果您调用任何 .dll,如果我没记错的话,您将在生成的文件中获得更多唯一标识符。

    调试版本是另一回事。我认为还有很多很多不同之处。

    【讨论】:

      【解决方案4】:

      使用增量构建系统 - 例如make 以确保在源不更改时不会重新编译代码。

      有可能让您的编译器从相同的源生成相同的二进制文件 - 也可能不会 - 这取决于编译器。大多数会在生成的二进制文件中嵌入当前时间。

      【讨论】:

      • 增量构建可能会将附加数据附加到您的目标文件中,这会产生差异。相反,您可能希望使用每次都从头开始构建的非增量构建。查看这篇 MS 文章:msdn.microsoft.com/en-us/library/4khtbfyf.aspx
      • @tguclu 这与我的增量含义不同。根据我的定义,增量构建系统对输出对象没有影响:只有在源发生变化时才会重新构建它们。
      猜你喜欢
      • 2017-08-16
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2016-09-01
      相关资源
      最近更新 更多