更改二进制文件而不更改源代码

tra*_*ter 0 unix binary timestamp elf

我有以下要求:查找我的二进制文件是否已更改。

我的源代码未更改。当我重新编译二进制文件时(在源代码中没有更改),我注意到二进制文件已更改。不是大小,而是内容。

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

有人可以建议我一种方法来找出二进制文件是否确实由于源代码的更改而发生了更改,而不是其他任何更改。

谢谢

Emp*_*ian 5

与Windows(每个.obj文件的文件头中都有一个编译时间戳)不同,UNIX对象文件(尤其是ELF文件)编码任何类型的时间戳。

但是,如果您的源使用__TIME____DATE__宏,则编译产生的目标文件将明显改变。此外,如果您要构建-g二进制文件,则包括编译时间戳在内的所有信息都可以记录为调试信息的一部分。

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

您的首要任务应该是了解一种构建与另一种构建之间的差异来自何处。

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

如果来自调试信息,请在将二进制文件传递给后比较它们strip -g

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