我正在搜索是否可以构建相同的Linux Kerneltwice(相同的源,相同的环境,相同的选项,相同的编译器)并获得相同的校验和。 有谁知道怎么做?
答案 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)
据推测,在同一环境中构建内核将导致相同的校验和。因此,相同的编译器(相同编译器的相同版本),完全相同的源,相同的依赖项(如果它甚至适用于内核编译)等。