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

Posted

技术标签:

【中文标题】Visual C++ 中的二进制再现性【英文标题】:Binary Reproducibility in Visual C++ 【发布时间】:2009-09-01 15:47:24 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这不仅仅是一个时间戳 - 还有一个用于 PDB 匹配的嵌入式 GUID - 正如 John Robbins explains。

除此之外,没有办法强制编译器生成一致的结果,正如 Jim Griesmer explains -

编译器编写者更感兴趣的是生成正确运行的代码并快速生成它,而不是确保生成的任何内容都以相同的方式布局在您的硬盘上。由于用于优化代码的方法和实现多种多样,因此一个构建最终可能会比另一个构建有更多的时间来做一些额外或不同的事情。因此,对于相同的功能,最终结果可能是一组不同的位。

因此,函数和节的顺序保证在结果 PE 中的顺序一致。链接中有一个示例。

【讨论】:

【参考方案2】:

我想您可以编写一个实用程序来打开 PE,将校验和设置为 0,将时间戳设置为您喜欢的值,重新计算 crc,然后将其写回。不过,如果有一种官方方法可以确保完美的二进制重现性,那就太好了。

更多信息: http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

【讨论】:

以上是关于Visual C++ 中的二进制再现性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual C++ 中将字节数组转换为十六进制字符串?

Visual Studio C++ 调试器:没有十六进制转储?

Visual C++ - 内存泄漏检测

Visual C++ - 内存泄漏检测

visual C++ 6.0 是先点“Compile”还是“Build”?分不分点击顺序??作用各是啥??

Visual Studio C++ 可再发行兼容性