同样的简单源代码,在Windows上生成不同的二进制文件

5

我有一个关于Windows上源代码二进制文件的问题。

#include <stdio.h>

int main()
{
    printf("Hello, world!\n");

    return 0;
}

同样的源代码,在Windows上我使用VS 2008命令提示符(“CL”)编译了两次,但得到了不同的二进制文件。

cl new.cpp

你们能告诉我为什么会出现这种情况,以及如何避免吗?

1
基本上没有编译器可以保证二进制文件完全相同——请参考 https://dev59.com/zEjSa4cB1Zd3GeqPHrfB 和 https://dev59.com/InM_5IYBdhLWcg3wrFIt。 - anon
1
为什么需要二进制文件完全相同? - jalf
3个回答

4
时间戳是PE格式的一部分。无论是否编译为发布版本,您总会得到不同的值。

我该如何避免这种情况?是否有可能删除时间戳?因为在Linux中,如果我使用g++/gcc,最终的二进制文件是相同的。 - Peter Lee
2
@Peter:ELF(Linux的可执行文件格式)没有时间戳字段。如果输出不同有什么关系? - Billy ONeal
@Billy:你说得对,ELF格式可能没有时间戳字段。同样的源代码生成不同的二进制文件真的很烦人。 - Peter Lee
@Peter:为什么那很烦人? - Billy ONeal
我所看到的唯一问题是,如果您正在尝试调试崩溃转储(也称为核心转储),那么就会出现问题。Windows调试工具将转储与二进制校验和相关联,因此即使没有代码更改,您也无法使用不同的二进制文件调试转储。有些工具可以更新转储文件中的校验和,但通常这不是一个好主意。顺便说一句,我不知道Unix世界如何处理这个问题。 - josuegomes

1
你是以发布版本编译的吗?调试版包含时间戳,可能会因每次编译而改变你的可执行文件。

按照上述指示编译产生了恰好1个字节的差异。嵌入式时间戳的最低有效位。 - mocj

1

我谷歌了一下,找到了一个折中的解决方案:

DUMPBIN  /RAWDATA  MyApp.EXE > first.txt
DUMPBIN  /RAWDATA  MyApp.EXE > second.txt

http://support.microsoft.com/kb/164151 如何比较同一项目构建的二进制图像


您也可以通过在两个可执行文件中将时间戳设置为相同值来解决此问题。 - Billy ONeal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接