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