如何針對自定義核心(Debian)進行編譯?
裡面有一個文件
version.h
。/usr/include/linux
許多標頭檔都包含此文件並defines
在其中使用它們自己的ifdefs
.但是,當我編譯自己的核心時,我看不到這如何正確反映在例如
version.h
.實際上,這適用於所有與核心相關的標頭檔。AFAICS
/usr/include/linux
始終代表我的發行版附帶的核心,而不是正在執行的核心,也不是我make
通過SYSSRC
.過去我求助於為自己的核心源創建符號連結,但我覺得這不是正確的方法。
這應該如何工作?如何針對自定義核心進行編譯(例如核心模組)?
在針對您自己的自定義核心配置系統時,我建議在您修改過的核心原始碼中為目前版本添加一個名稱。
例如,在 Armbian 中,他們創建自己的核心包,並將 -sunxi 添加到 kernel.release。
以修改4.6.3核心版本為例:
root@ruir:/usr/src/linux-headers-4.6.3-sunxi# grep -ri 4.6.3-sunxi * include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi" include/config/kernel.release:4.6.3-sunxi
而且,對於核心模組,在
/lib/modules/4.6.3-sunxi/build
:include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi" include/config/auto.conf.cmd:ifneq "$(KERNELVERSION)" "4.6.3-sunxi" include/config/kernel.release:4.6.3-sunxi
(請參閱在 ARM / Armbian Jessie 中安裝 sysdig - 以錯誤的核心版本編譯的模組)
如我們所見,這可以在
uname -r
:$uname -r 4.6.3-sunxi
至於自定義核心包:
$dpkg -l | grep sunxi ii linux-dtb-next-sunxi 5.16 armhf Linux DTB, version 4.6.3-sunxi ii linux-firmware-image-next-sunxi 5.16 armhf Linux kernel firmware, version 4.6.3-sunxi ii linux-headers-next-sunxi 5.16 armhf Linux kernel headers for 4.6.3-sunxi on armhf ii linux-image-next-sunxi 5.16 armhf Linux kernel, version 4.6.3-sunxi
至於添加自己的編譯核心標頭檔,我將參考KernelHeaders(強調為粗體是我的);如果您要替換次要核心版本,您可能(或可能不會)只使用
make headers_install
.使用者空間程序
通常,使用者空間程序是根據發行版提供的標頭檔建構的,通常來自名為 glibc-devel、glibc-kernheaders 或 linux-libc-dev 的包。這些標頭檔通常來自較舊的核心版本,如果不重新建構 glibc 也無法安全地替換它們。特別是,非常不建議將 /usr/include/linux 安裝為 /usr/src/linux/include 或 /lib/modules/*/build/include/linux 的符號連結,因為它經常會破壞重建應用程序。例如,較舊的核心在 include/asm- 中具有特定於體系結構的標頭檔 $ {arch} instead of arch/ $ {arch}/include/asm 並帶有指向架構特定目錄的符號連結。
為發行版打包標頭檔的正確方法是從核心源目錄執行’make headers_install’,將標頭檔安裝到/usr/include,然後重建C庫包,依賴於特定版本的just安裝核心標頭檔。
如果您分發的使用者空間程序依賴於某些核心標頭檔的特定版本,例如,因為您的程序僅在打更新檔或最近的核心上執行,您不能依賴 /usr/include 中的標頭檔。您也不能使用 /usr/src/linux/include 或 /lib/modules/*/build/include/ 中的標頭檔,因為它們還沒有準備好包含在使用者空間中。如果您嘗試並指向此 Wiki 頁面,核心應該會警告您。解決此問題的正確方法是隔離您需要的特定介面,例如,在新核心中修補的單個標頭檔為您的程序使用的字元設備提供 ioctl 編號。在您自己的程序中,添加該源文件的副本,並註意它應該與新的核心版本保持同步。如果您的程序未在 GPLv2 下獲得許可,請確保您已獲得該文件作者的許可,以根據您自己的程序的許可分發它。由於您的程序現在依賴於正常核心中可能不存在的核心介面,因此添加執行時檢查以確保核心理解該介面並在沒有回退到舊核心時提供有用的錯誤消息是一個好主意界面。
也用於核心開發;或者為不同的伺服器或安裝了多個核心版本的不同核心編譯核心/模組,SYSSRC 可能用於指定備用核心源位置。