簡體   English   中英

如何構建相同的Linux內核兩次源並獲得相同的校驗和

[英]How to build the same Linux Kernel twice sources and get the same checksum

我正在搜索是否可以構建相同的Linux Kerneltwice(相同的源,相同的環境,相同的選項,相同的編譯器)並獲得相同的校驗和。 誰知道怎么做?

構建日期包含在版本中,請參閱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中定義:

/* 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由scripts / mkcompile_h生成,您可以在其中找到以下行:

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

通過從前一行中刪除date ,您應該能夠擺脫構建時依賴性。

shodanex的答案是對的,但不完整。 經過一些研究后我發現Linux內核二進制嵌入了一個默認的ramfs,這是兩個內核編譯之間差異的另一個原因(CPIO RAMFS頭嵌入日期)。 禁用此功能是不可能的,但可以提供默認的ramfs。 執行此操作時,您將獲得完全相同的校驗和。

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

@gsempe,你想找到這個:“make kernel build deterministic”ref。 http://lwn.net/Articles/437864/

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

即使是編譯兩次的簡單hello世界也會產生不同的二進制文件。 不知何故,鏈接器正在添加一些在每個構建中發生變化的信息。

最快的檢查方法是制作,復制,制作干凈,然后重新制作。 如果校驗和匹配,則可能。 如果沒有那么那表明Make正在以某種方式改變一些源文件(構建編號,構建日期等)

據推測,在同一環境中構建內核將導致相同的校驗和。 所以,相同的編譯器(相同編譯器的相同版本), 完全相同的源,相同的依賴項(如果它甚至適用於內核編譯),等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM