Kernel
核心是否需要在與使用者空間相同的開發環境中編譯?
假設我的使用者空間(包)是用
gcc 4.7
和libc6 2.13
(Debian Wheezy)編譯的我可以在不同的開發環境下編譯linux核心嗎,例如
gcc 6.3
andlibc6 2.24
(即在Debian Stretch下)?我知道與包不同,核心沒有與任何動態庫連結。所以理論上,它應該在哪個
gcc
和libc
它下編譯沒有區別。這是真的 ?我這樣做時會遇到麻煩嗎?可能有一些不同
gcc
版本引起的不兼容嗎?另一方面,newer
gcc
有一些有趣的功能,更好的安全性。所以也許,核心應該用最新的編譯gcc
?
正如您所指出的,正在使用的 C 庫對核心沒有影響,核心不使用 C 庫。(存在間接影響,因為它用於建構核心在建構過程中使用的工具,但這極不可能影響最終結果。)
核心可以用多種不同的編譯器版本建構;根據其文件,它只需要 GCC 3.2 或更高版本。您還會發現核心正式支持最新版本的 GCC 可能需要一段時間,而分發核心使用它可能需要更長的時間。例如,Debian Linux 核心包使用 GCC 6,甚至有專門的包來提供正確的編譯器版本(
linux-compiler-gcc-6-x86
onamd64
和i386
)。用於核心的編譯器和用於使用者空間的編譯器之間沒有任何联系(也不一定需要為所有使用者空間使用相同的編譯器——使用 GCC 3 甚至 2 建構的舊程序仍然可以在現代系統上執行)。較新的編譯器版本確實提供了更多的安全功能,但 GCC 6 對於核心中使用的大多數安全功能(如果不是全部的話)來說已經足夠了。