Linux

安裝核心標頭檔而不覆蓋舊標頭檔

  • July 31, 2014

我已經建構了一個執行良好的更新(3.16-rc2)核心。我的使用者空間程序需要連結到較新的標頭,因為它在 fcntrl.h 等中使用了一些新定義。

我的問題是如何在執行“make headers_install”時保留舊核心的標頭檔?

如果執行

make headers_install INSTALL_HDR_PATH=/usr/src/kernels/`uname -r` 

標題定義衝突,因為 /usr/src/include 仍在 PATH 中。

處理這個問題的正確方法是什麼?

您不能#include使用相同路徑的兩個標頭,但您可以在正常路徑之外安裝一個,並在使用適當的開關(對於 gcc,-I)進行編譯時取代這些標頭。asm/fcntl.h我認為您已經了解了這些內容,因此如果您在正常的包含目錄中放置了多個目錄,則無需過多思考即可辨識出您,無論如何只有其中一個會適用

不過,我認為您不必擔心太多。從您的一些評論開始:

可以禁用使用者空間程序中使用較新核心機制的那些功能。

這很好。如果您需要#define NEWVALUE 666為了compile,並且這涉及僅適用於較新核心的功能,並且您可以擷取或禁用此類功能,那麼實際應用的部分NEWVALUE將永遠不會被呼叫。請記住,並不是說在舊核心執行時沒有定義可用的標頭檔——即使有,也沒關係,因為執行時的真正問題是你有效地呼叫了不存在的部分核心ABI。您根本不需要任何標頭檔來執行執行檔,因此回到舊核心對此無關緊要。

也許我是偏執狂,但…

是和不是。如果這是一個系統,在這個系統中,不同的人在不同的核心標頭檔中任意交換,以便在編譯將留下並在以後使用舊核心執行的東西時利用新功能,那麼偏執狂是一個適當的響應,哈哈。然而,真正屬於這一類的東西可能並不多。

發行版在每次升級時都會替換核心標頭檔,但是他們必須同時替換的使用者空間列表通常看起來並不長(如果它存在的話)。我想這部分是因為在這種情況下保持向後兼容性非常容易,但我認為這也是因為這種情況下的事情不會隨著時間的推移而發生巨大變化。

我想我可以保存舊的標題並重新安裝它們。

您可以這樣做,或者您可以在需要時從適當的來源替換它們(make headers_install);如果它是發行版核心並且您擔心它們可能會被修補,則發行版應該有一個源包。

引用自:https://unix.stackexchange.com/questions/147727