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

时间:2009-09-01 15:47:25

标签: c++ visual-studio visual-c++ portable-executable binary-reproducibility

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

2 个答案:

答案 0 :(得分:4)

这不仅仅是一个时间戳 - 用于PDB匹配的嵌入式GUID - 就像John Robbins explains一样。

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

  

编译器编写者对生成正确运行的代码并快速生成代码更感兴趣,而不是确保生成的内容在硬盘驱动器上的布局相同。由于优化代码的方法和实现众多且多样化,因此总有可能一个构建最终会花费更多时间来执行额外或不同于另一个构建的操作。因此,最终结果可能是相同功能的不同位组。

因此,函数和区段顺序保证在生成的PE中始终如一地排序。一个例子是链接。

答案 1 :(得分:3)

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

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