同じ Linux Kerneltwice (同じソース、同じ環境、同じオプション、同じコンパイラ) をビルドし、同じチェックサムを取得できるかどうかを調べています。誰でもその方法を知っていますか?
6 に答える
ビルドの日付はバージョンに含まれています。initversion.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 が埋め込まれていることがわかりました。これは、2 つのカーネル コンパイルの違いのもう 1 つの理由です (CPIO RAMFS ヘッダーの埋め込み日付)。この機能を無効にすることはできませんが、デフォルトの ramfs を提供することは可能です。これを行うと、まったく同じチェックサムが得られます。
ありがとうございました。あなたの答えは、私の問題を解決するのに大いに役立ちます。
2回コンパイルされた単純なHelloWorldでさえ、異なるバイナリになります。どういうわけか、リンカーはビルドごとに変更される情報を追加しています。
チェックする最も簡単な方法は、作成し、コピーを取り、クリーンにし、再度作成することです。チェックサムが一致すれば可能です。そうでない場合は、Make が何らかの方法で一部のソース ファイルを変更していることを示唆しています (ビルド番号、ビルド日付など)。
おそらく、同じ環境でカーネルをビルドすると、同じチェックサムが得られます。つまり、同じコンパイラ (同じコンパイラの同じバージョン)、まったく同じソース、同じ依存関係 (カーネル コンパイルに適用できる場合) などです。