【问题标题】:Compiling Twice with Delphi 6 and getting the same checksum on the binary使用 Delphi 6 编译两次并在二进制文件上获得相同的校验和
【发布时间】:2009-12-01 22:55:49
【问题描述】:

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

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 我只是古玩(无意冒犯):您想验证 exe 校验和在 2 个构建之间没有变化的场景是什么?
  • 我会发现每个“.obj”(或 Delphi 中的等价物)都有一个时间戳,该时间戳正在进入您的 .exe
  • 与代码传输有关,对方需要测试二进制文件并随后验证代码是否与其对应。到目前为止,我还没有想出另一种方案来做到这一点。

标签: delphi compiler-construction linker checksum binary-reproducibility


【解决方案1】:

几年前我们研究过这个问题,我记得答案很简单,就是 Borland/Codegear/Embarcadero 的人们不同意编译器应该在给定完全相同的输入的情况下产生完全相同的输出的概念(考虑到当前日期时间不能被视为输入)。

这令人失望,但鉴于 Delphi 的主要版本已经老了 10 个,它可能不会改变。

【讨论】:

    【解决方案2】:

    根据您在问题中的评论,我认为您正在寻找这个问题的答案:

    如何验证某个二进制文件是由某组源文件创建的

    一种方法是建立一个自动化的构建过程:

    1. 在源代码中插入一个唯一的验证标记(可能与包含文件中的 GUID 字符串或其他内容一样简单)
    2. 使用该验证标签编译二进制文件
    3. 将生成的二进制文件和源代码打包到交付目录树中

    您必须确保您的源代码确实使用了该验证标签(例如通过显示在关于框或类似的东西中)。

    我使用FinalBuilder 来自动化这样的构建过程。

    --杰罗恩

    【讨论】:

      【解决方案3】:

      很遗憾,我还没有听说过这个问题的任何答案。

      这不仅仅是时间戳,在某些地方,内存中的一些随机垃圾最终会出现在结果中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-02
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多