2009-06-29 17 views

回答

7

構建日期包含在版本中,請參閱INIT version.c:

const char linux_banner[] = 
    "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" 
    LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n"; 

和UTS_VERSION被定義在include/linux/compile.h:由腳本/ mkcompile_h,在那裏你找到下面的行產生

/* This file is auto generated, version 1 */ 
/* PREEMPT */ 
#define UTS_MACHINE "arm" 
#define UTS_VERSION "#1 PREEMPT Mon Jun 29 10:49:17 CEST 2009" 
#define LINUX_COMPILE_TIME "10:49:17" 
#define LINUX_COMPILE_BY "cynove" 
#define LINUX_COMPILE_HOST "jp" 
#define LINUX_COMPILE_DOMAIN "evonyc" 
#define LINUX_COMPILER "gcc version 4.3.2 (crosstool-NG-1.4.0) " 

compile.h:

UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS `LC_ALL=C LANG=C date`" 

通過從上述行中刪除date,您應該能夠擺脫構建時間依賴關係。

0

最快的檢查方法是製作,複印,清潔,然後重新制作。如果校驗和匹配,那麼它可能。如果不是,那麼表明Make以某種方式修改了某些源文件(內部編號,內部日期等)

0

假設在相同環境中構建內核將導致相同的校驗和。因此,相同的編譯器(相同版本的相同編譯器),完全是相同的來源,相同的依賴關係(如果它甚至適用於內核編譯)等。

+0

即使具有完全相同的環境設置(相同的源,相同的編譯器和相同的依賴關係),兩個連續的構建也會給出不同的校驗和。我認爲問題在於編譯選項,我不知道可以更改哪些編譯選項,以便在不修改內核正確性的情況下獲得相同的校驗和。 – gsempe 2009-06-29 08:45:46

1

即使是一個簡單的hello world編譯兩次也會導致不同的二進制文件。不知怎的,鏈接器添加了一些在每個構建中發生變化的信息。

+0

當結果二進制文件被剝離時,這仍然是真的嗎? – shodanex 2009-06-29 09:22:02

5

shodanex的答案是正確的,但不完整。 經過一番研究,我發現Linux內核二進制嵌入了默認的ramfs,這是兩個內核編譯(CPIO RAMFS頭嵌入日期)之間差異的另一個原因。禁用此功能是不可能的,但可以提供默認的ramfs。 當你這樣做時,你會得到完全相同的校驗和。

謝謝。你的回答可以幫助我解決我的問題。

2

@gsempe,你想尋找這樣的:「讓內核構建確定性」 ref。 http://lwn.net/Articles/437864/

有可能擺脫噪音 的某些來源(噪音......在旁觀者;-)的眼睛

+0

偉大的補充,但我已經解決了我的問題。看看這裏http://stackoverflow.com/a/1214926/21052 – gsempe 2014-01-20 11:10:41

相關問題