2012-06-04 83 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