问题标签 [binary-reproducibility]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
980 浏览

delphi - 为什么每次构建都会更改 exe 文件?

构建相同的项目(没有任何更改)会产生二进制不同的 exe 文件:它们的一些小区域是不同的。空项目、版本信息(以及每次构建的自动增量)已关闭。

为什么会发生?是否可以让 delphi 为相同的项目生成二进制相等的文件?

0 投票
4 回答
850 浏览

c++ - 可重复的目标代码生成 C++

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

0 投票
6 回答
3011 浏览

linux - 如何构建相同的 Linux 内核两次源并获得相同的校验和

我正在寻找是否可以两次构建相同的 Linux 内核(相同的源、相同的环境、相同的选项、相同的编译器)并获得相同的校验和。有人知道该怎么做吗?

0 投票
6 回答
2303 浏览

c# - 为什么 C# 会为相同的源代码生成不同的 EXE?

每次我们重新编译我们的 C# 应用程序时,我们都会得到具有不同 MD5 签名的 EXE。我们在同一台机器上重新编译,相隔几分钟。为什么相同的源代码不会产生相同的输出?有没有办法解决这个问题?

0 投票
2 回答
2161 浏览

c++ - Visual C++ 中的二进制再现性

有没有办法强制相同的代码在 Visual C++ 中生成相同的二进制文件?关闭PE中的时间戳或强制PE中的时间戳为某个固定值,换句话说?

0 投票
6 回答
3609 浏览

c# - 如何在重建 C# 应用程序时始终生成逐字节相同的 .exe?

我先给你一些背景知识,为什么我要问这个问题:

我目前在一个受到严格监管的行业工作,因此我们的代码由官方测试机构仔细检查。这些测试机构希望能够构建代码并生成每次都完全相同的 .exe 或 .dll(显然无需更改任何代码!)。他们检查他们创建的可执行文件的 MD5 和 SHA1 以确保这一点。

到目前为止,我主要使用 C++ 进行编码,其中(经过一些项目设置调整)我设法让项目以一致的方式重建为相同的 MD5/SHA1。我现在在一个项目中使用 C#,并且在重建后很难让 MD5 匹配。我知道文件的 PE 头中有“时间戳”,它们已被清除为 0。我还知道 .exe 有一个 GUID,它再次被清除为 00 00 00 ...等等。但是文件仍然不匹配。

我正在使用 CFF Explorer 查看和编辑 PE 标头以删除时间和日期戳。使用二进制比较工具后,.exe 中只有 2 个不同的字节块(都非常小)。

不一致的块之一出现*Project*\obj\Release\xxx.pdb一些二进制代码之前,它以 ASCII 格式详细说明了文件的路径。

编辑:现在已知这是 *.pdb 文件的 GUID,但是我仍然不知道是否可以修改它而不会导致任何错误!?

另一个块出现在看起来是函数名称的中间,即。(典型部分)AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{

然后是不同的代码块:

4A134ACE-D6A0-461B-A47C-3A4232D90816

其次是:

"}.ValueType.__StaticArrayInitTypeSize=7.$$method0x60000ab-1.RuntimeFieldHandle.InitializeArray`... 等等。

任何想法或建议都将受到欢迎!

0 投票
2 回答
155 浏览

c - Solaris cc 是否为不同的编译嵌入了不同的可执行信息?

天,

之前有人问过 VC++,但我对 Solaris 的答案很感兴趣。

我正在编译和链接以下琐碎的 C 代码:

使用命令:

并这样做几次以获得可执行文件 hello2 和 hello3。这是在同一台机器上使用相同的编译器并在不同的时间在同一目录中完成的。

可执行文件的大小相同,但 diff 报告二进制文件不同,并且 cmp -l 因一长串不同位置而疯狂。

任何人都知道 cc 在可执行文件中嵌入了什么以使它们不同吗?时间戳?

编辑:按照 Chris 的建议剥离可执行文件,使 diff 将两个可执行文件报告为相同。

干杯,

0 投票
3 回答
643 浏览

delphi - 使用 Delphi 6 编译两次并在二进制文件上获得相同的校验和

出于二进制/源代码验证的目的,我希望能够相隔两周在同一台计算机上进行两次编译,并使二进制文件相同,从而通过一些校验和测试。

到目前为止,我发现编译器很可能会将时间戳写入二进制文件中。我可以通过比较这个 msdn 文章中的 dumpbin /rawdata 结果来解决这个问题。

http://support.microsoft.com/kb/164151

然而,dumpbin 结果在十几个地方仍然存在差异,并且差异似乎仍然是某种时间戳(例如从 A1 73 变为 C4 76)。

我假设这是 delphi 编译器放入代码/数据部分的时间戳,但我找不到发生这种情况的位置或如何将其关闭。摆弄各种编译器/链接器选项并没有改变这种行为。

任何帮助将不胜感激。

0 投票
5 回答
777 浏览

c++ - 为什么构建同一个项目会为每个开发人员生成不同的 EXE 文件

我和我的团队正在开发一个 VC++ 6 项目。我们都使用相同的代码库(使用版本控制系统),并且我们所有的编译器/链接器/环境设置(包括包含目录顺序),据我们所知,都是完全相同的。当然,我们使用相同的 VC++ 版本和相同的服务包 (VC6 SP6)。

问题是我们每个人构建的EXE都有点不同。

我知道每次在同一台计算机上构建 EXE 时,文件中有 3 个位置链接器存储时间戳。我不是在谈论这些差异。

虽然我们的 EXE 文件的长度完全相同,但当我们比较 EXE 时,有 1000 个字节不同。其中许多字节的值相差 0x20。

知道可能是什么原因吗?

编辑:调试构建(实际上,我们没有检查发布)。

编辑:区别在于二进制部分,而不是文本字符串。

编辑:所有开发人员都使用相同的驱动器/文件夹名称,用于源和产品。

0 投票
2 回答
2035 浏览

vb6 - 您如何验证 VB 6 可执行文件的 2 个副本来自同一代码库?

我有一个版本控制下的程序,它已经经历了多个版本。今天出现了一种情况,有人以某种方式设法指向该程序的旧副本,因此遇到了已修复的错误。我想返回并删除该程序的所有旧副本(保留它们是公司的一项政策,该政策可以追溯到版本控制很普遍并且不再需要)但我需要一种方法来验证我可以生成完全相同的可执行文件,这比说“旧的来自这个提交,所以这个应该是一样的”要好。

我最初的想法是简单地对可执行文件进行 MD5 哈希,将哈希文件存储在源代码管理中,然后完成它,但我遇到了一个我什至无法解析的问题。

似乎每次生成可执行文件(方法:Open Project.File > Make X.exe)它的哈希值都不同。我注意到每次以看似随机的方式打开项目时,Visual Basic 都会弄乱文件,但我认为这不会使其成为可执行文件,我也没有任何证据表明确实发生了这种情况。为了防止这种情况发生,我尝试在同一个 IDE 会话中多次生成可执行文件并检查哈希值,但它们每次都不同。

所以那是:

  1. 生成可执行文件
  2. 生成 MD5 校验和:md5sum X.exe > X.md5
  3. 验证当前可执行文件的 MD5:md5sum -c X.md5
  4. 生成新的可执行文件
  5. 验证新可执行文件的 MD5:md5sum -c X.md5
  6. 验证失败,因为计算的校验和不匹配。

我不了解 MD5 或 VB 6 生成可执行文件的方式,但我也没有接受使用 MD5 的想法。如果有更好的方法来验证两个可执行文件确实相同,那么我会全力以赴。

在此先感谢您的帮助!