2012-06-04 82 views
0

我有以下要求:查找我的二进制文件是否已更改。在源代码中无更改的二进制中的更改

我的源代码没有改变。当我重新编译二进制文件(没有改变源代码)时,我注意到二进制文件被改变了。不在大小中,但在内容中。

在调试一下,我发现在二进制文件里面有一些叫做“Link Time”的东西。这是二进制链接时的实际时间戳。由于每次编译都会给出不同的时间戳,因此我的二进制内容总是不同的。但实际上它应该是一样的。

有人可以建议我找出一种方法,以确定二进制文件是否因源代码更改而发生实际更改,而不是其他任何内容。

感谢

+0

你的目标是?你为什么需要这个? –

+0

嗨Emil,我需要它因为我更新任何源代码并在颠覆中检查它时触发了我的构建服务器。它检查所有的源代码,编译它们,然后我只需要将修改后的二进制文件签入到subversion中。但我无法找到实际修改的二进制文件。 Subversion告诉我所有的二进制文件都会更新这个链接时间。 – tranceporter

回答

4

与Windows中(其中每个obj文件有一个编译时间戳的文件头),UNIX目标文件,特别是ELF文件做编码任何种类的时间戳。

但是,如果您的源代码使用__TIME____DATE__宏,那么通过编译产生的目标文件将明显改变。此外,如果您正在构建-g二进制文件,则可以将各种信息(包括编译时间戳记)记录为调试信息的一部分。

最后,您可能正在使用的链接器记录链接时间戳(作为供应商扩展)。

您的第一个任务应该是了解其中一个构建与下一个构建之间的差异来自哪里。

如果从__DATE____TIME__,消除它们从您的来源。

如果来自调试信息,在通过strip -g传递它们之后比较二进制文件。

如果来自供应商链接器扩展,请查看是否有禁用此类时间戳的标志。如果没有一个,你必须写一个工具,只比较你感兴趣的部分。您可以使用readelf -x.text a.out等等来仅比较.text部分(您还需要比较.data.rodata,以及其他许多人)。

+0

布拉沃,优秀的诊断和假说生成!祝你们好运。 – shellter