【发布时间】:2009-06-29 08:01:25
【问题描述】:
我正在寻找是否可以两次构建相同的 Linux 内核(相同的源、相同的环境、相同的选项、相同的编译器)并获得相同的校验和。 有人知道怎么做吗?
【问题讨论】:
-
@RamenChef 的版本没有任何意义...... StackOverflow 真的有可能变得如此糟糕吗?
标签: linux binary kernel checksum binary-reproducibility
我正在寻找是否可以两次构建相同的 Linux 内核(相同的源、相同的环境、相同的选项、相同的编译器)并获得相同的校验和。 有人知道怎么做吗?
【问题讨论】:
标签: linux binary kernel checksum binary-reproducibility
构建日期包含在版本中,参见 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,你想寻找这个:“使内核构建确定性” 参考。 http://lwn.net/Articles/437864/
可以消除某些噪音源 (噪音是......在旁观者的眼中;-)
【讨论】:
即使是一个简单的 hello world 编译两次也会产生不同的二进制文件。不知何故,链接器正在添加一些信息,这些信息会在每个构建中发生变化。
【讨论】:
最快的检查方法是制作,复制,制作干净,然后再制作。如果校验和匹配,那么它是可能的。如果不是,则表明 Make 正在以某种方式更改某些源文件(构建编号、构建日期等)
【讨论】:
大概,在相同的环境中构建内核将导致相同的校验和。因此,相同的编译器(相同编译器的相同版本)、完全相同相同的源、相同的依赖项(如果这甚至适用于内核编译)等等。
【讨论】: