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

时间:2009-02-24 12:35:55

标签: c++ binary-reproducibility

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

4 个答案:

答案 0 :(得分:3)

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

MacOSX上的示例

otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220

但是,有人错过了全局数据......(也可能是要包含的参数)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您无法对visual studio进行md5校验和比较。对于Visual Studio中的正常Release版本.exe文件,每次重新编译时将有3个位置发生变化。其中2个是时间戳,第三个是Visual Studio用于将.exe版本与帮助文件匹配的唯一GUID,以确保它们同步。

有可能编写一个将3个更改字段清零的工具,但我不确定解析文件有多容易。

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

Debug版本是另一回事。我认为还有很多很多不同。

答案 3 :(得分:1)

使用增量构建系统 - 例如make,以确保在源不发生变化时不重新编译代码。

有可能让你的编译从相同的源创建相同的二进制文件 - 或者它可能不是 - 它取决于编译器。大多数人会将当前时间嵌入到生成的二进制文件中。