【问题标题】:Reproducible builds with Visual Studio - object file difference使用 Visual Studio 的可重现构建 - 目标文件差异
【发布时间】:2015-12-15 11:12:14
【问题描述】:

我试图确保两台不同的机器产生相同的构建。我试图使环境尽可能相似,但我仍然看到生成的 .obj 和 .exe 文件存在一些差异。我已经能够排除嵌入式路径差异和时间戳。我还确保了最少的代码示例(例如 hello world 程序实际上会生成相同的二进制文件)。

目前一些目标文件是相似的,而另一些则不是。如果我使用dumpbin /all 的差异查看不同之处,我会看到如下差异:

> COMDAT; sym= "public: static int const std::numeric_limits<long double>::max_exponent" (?max_exponent@?$numeric_limits@O@std@@2HB)

< COMDAT; sym= "public: static int const std::_Locbase<int>::collate" (?collate@?$_Locbase@H@std@@2HB)

在许多SECTION HEADER。在没有 100% 证明的情况下,在我看来,每个差异都是在另一个目标文件的转储输出的另一个部分中出现的一行。所以事情似乎有不同的顺序。 (但请注意,这只是我目前的假设——我可能错了。)

关于如何从这里继续前进以及原因可能是什么的任何提示?构建/链接顺序?

我还看到微软写this

注意:不能保证 Visual C++ 在连续构建时生成相同的源文件时会生成相同的二进制映像。但是,您可以保证 EXE(或 DLL)在执行时的行为方式完全相同,所有其他条件都相同。

但我仍然想知道在我的具体情况下发生了什么。在我的情况下,同一台机器上的连续构建提供相同的构建。

【问题讨论】:

  • 不可能从不同的机器(甚至是同一台机器)得到相同的二进制文件。除非您明确说明哪些部分应该相同(以及您将如何处理这些信息),否则这个问题只能回答为:不可能。
  • @IInspectable - 对我来说,证明单个构建对就足够了 - 我不需要连续的二进制匹配。但总的来说,这是一个在 Windows 中比在 Linux 中更难解决的问题吗? VS 的限制?我已经看到几个关于在 Linux 上构建可重复性的工作取得进展的案例 - 例如 debian 包。
  • 正如您已经引用的那样,Visual Studio 保证相同的行为,仅此而已。您还没有解释为什么您需要知道 2 个二进制文件是否相同(对于 identical 的某些定义)。在不知道为什么需要这些信息的情况下,很难提供令人满意的答案。
  • @IInspectable - 这是一个安全要求,(类似于 TrueCrypt 审计中所做的)。如果有差异,我至少应该能够找出原因。在我上面展示的情况下,我仍然没有令人满意的答案。对于较小的程序,我已经能够确定差异 A 是由于 X 而差异 B 是由于 Y。
  • 您是否尝试过链接到的知识库文章中推荐的步骤(特别是使用带有 /RAWDATA 开关的 DUMPBIN),即使它们可能适用于您未使用的编译器?跨度>

标签: c++ visual-studio-2012 object-files binary-reproducibility


【解决方案1】:

因此,尽管我无法准确解释为什么二进制文件看起来像这样,但我还是发现了环境中的一个“意外”差异,这是根本原因。

构建日志提到了 rc.exe(资源编译器)的不同版本。事实证明,它是 VS 附带的 Windows 工具包的一部分。但是,如果您安装两个版本的 Visual Studio,它们将共享 rc,而编译器和链接器是分开的。

在确保安装了我未编译的其他 VS 后,将二进制文件更改为符合我的预期。

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2017-05-01
    • 2013-02-22
    • 1970-01-01
    • 2023-03-24
    • 2011-04-08
    相关资源
    最近更新 更多