【发布时间】:2009-02-24 12:35:55
【问题描述】:
当我使用 c++ 编译器构建项目时,如果源代码没有变化,我能否确保生成的二进制文件不受影响?看起来每次我重新编译我的源代码时,二进制文件的 md5 校验和都会受到影响。编译时间是否会以某种方式影响生成的二进制文件?如何生成可重复的编译结果?
【问题讨论】:
-
也许您需要一种更好的方法来跟踪除 md5 二进制文件之外的版本?
标签: c++ binary-reproducibility
当我使用 c++ 编译器构建项目时,如果源代码没有变化,我能否确保生成的二进制文件不受影响?看起来每次我重新编译我的源代码时,二进制文件的 md5 校验和都会受到影响。编译时间是否会以某种方式影响生成的二进制文件?如何生成可重复的编译结果?
【问题讨论】:
标签: c++ binary-reproducibility
可以反汇编二进制文件并在输出上运行 md5
MacOSX 上的示例
otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220
但是,一个人错过了全局数据...(也可能是一个参数)
我正在回答 md5 检查二进制文件的问题...您如何像其他人所写的那样管理您的源代码和构建系统也是一个值得关注的问题
【讨论】:
我怀疑这在很大程度上取决于您的工具链和操作系统。例如,如果其中一个可执行标头包含时间戳,那么您总是会发现生成的 MD5 是不同的。
你想要达到的最终结果是什么(即为什么它们相同如此重要)..?
【讨论】:
您不能对 Visual Studio 进行 md5 校验和比较。对于来自 Visual Studio 的普通发行版 .exe 文件,每次重新编译都会有 3 个位置发生变化。其中两个是时间戳,第三个是唯一的 GUID,Visual Studio 使用它来匹配 .exe 的版本和帮助文件以确保它们同步。
也许可以编写一个工具将 3 个变化的字段归零,但我不确定解析文件是否容易。
另外,如果您调用任何 .dll,如果我没记错的话,您将在生成的文件中获得更多唯一标识符。
调试版本是另一回事。我认为还有很多很多不同之处。
【讨论】:
使用增量构建系统 - 例如make 以确保在源不更改时不会重新编译代码。
有可能让您的编译器从相同的源生成相同的二进制文件 - 也可能不会 - 这取决于编译器。大多数会在生成的二进制文件中嵌入当前时间。
【讨论】: