如何构建相同的Linux内核两次源并获得相同的校验和

时间:2009-06-29 08:01:25

标签: linux binary kernel checksum binary-reproducibility

我正在搜索是否可以构建相同的Linux Kerneltwice(相同的源,相同的环境,相同的选项,相同的编译器)并获得相同的校验和。 有谁知道怎么做?

6 个答案:

答案 0 :(得分:8)

版本的日期包含在版本中,请参阅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,您应该能够摆脱构建时依赖性。

答案 1 :(得分:5)

shodanex的答案是对的,但不完整。 经过一些研究后我发现Linux内核二进制嵌入了一个默认的ramfs,这是两个内核编译之间差异的另一个原因(CPIO RAMFS头嵌入日期)。禁用此功能是不可能的,但可以提供默认的ramfs。 执行此操作时,您将获得完全相同的校验和。

谢谢。你的回答帮助我解决了我的问题。

答案 2 :(得分:2)

@gsempe,你想寻找这个:“使内核构建确定性” REF。 http://lwn.net/Articles/437864/

可以摆脱某些噪音源 (噪音是......在旁观者的眼中; - )

答案 3 :(得分:1)

即使是编译两次的简单hello世界也会产生不同的二进制文件。不知何故,链接器正在添加一些在每个构建中发生变化的信息。

答案 4 :(得分:0)

最快的检查方法是制作,复制,制作干净,然后重新制作。如果校验和匹配,则可能。如果没有那么那表明Make正在以某种方式改变一些源文件(构建编号,构建日期等)

答案 5 :(得分:0)

据推测,在同一环境中构建内核将导致相同的校验和。因此,相同的编译器(相同编译器的相同版本),完全相同的源,相同的依赖项(如果它甚至适用于内核编译)等。