我有以下要求:查找我的二进制文件是否已更改。
我的源代码没有变化。当我重新编译二进制文件(源代码中没有更改)时,我注意到二进制文件已更改。不是大小,而是内容。
稍微调试一下,我发现二进制文件中有一个叫做“链接时间”的东西。这是链接二进制文件时的实际时间戳。现在,因为每个编译都会给出不同的时间戳,因此我的二进制内容总是不同的。但实际上应该是一样的。
有人可以建议我找出二进制文件是否因源代码更改而实际更改,而不是其他任何内容。
由于
答案 0 :(得分:4)
与Windows(每个.obj文件的文件头中都有编译时间戳)不同,UNIX对象文件,特别是ELF
文件不编码任何类型的时间戳。
但是,如果您的源使用__TIME__
和__DATE__
宏,则编译生成的目标文件显然会发生变化。此外,如果要构建-g
二进制文件,则可以将各种信息(包括编译时间戳)记录为调试信息的一部分。
最后,您使用的链接器可能会记录链接时间戳(作为供应商扩展)。
你的第一个任务应该是理解从一个构建到另一个构建的差异来自哪里。
如果来自__DATE__
和__TIME__
,请从您的来源中删除它们。
如果来自调试信息,请在通过strip -g
后对二进制文件进行比较。
如果来自供应商链接器扩展,请查看是否有标志来禁用此类时间戳。如果没有,你必须编写一个只比较你感兴趣的部分的工具。您可以使用readelf -x.text a.out
等来仅比较.text
部分(您还需要比较.data
,.rodata
,以及可能还有许多其他部分。