2015-06-09 131 views
2

我想建立支持上CentOS 7eBPF一個應用程序(內核版本是3.10.0):如何構建Linux內核以支持SO_ATTACH_BPF套接字選項?

if(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, sizeof(prog_f)) { 
    ...... 
} 

所以我下載一個4.0.5版本,請在以下配置:

CONFIG_BPF=y 
CONFIG_BPF_SYSCALL=y 

然後按照這個link來構建和安裝一個4.0.5內核。

執行make modules_install install後,我發現<asm-generic/socket.h>中仍然沒有SO_ATTACH_BPF,所以上面的代碼無法成功編譯。

如何構建Linux內核以支持SO_ATTACH_BPF套接字選項?

回答

2

在我的基於Fedora 21的設置中,我使用了非常類似於您鏈接的步驟來編譯和安裝最新內核的步驟。作爲一個額外的步驟,我會做從內核構建樹下面的內核頭文件安裝到/ usr /本地/包括:

sudo make INSTALL_HDR_PATH=/usr/local headers_install 

這將導致這兩個股票的內核頭文件來保持安裝在/usr/include/{linux,asm,asm-generic,...} ,並在/usr/local/include/{linux,asm,asm-generic,...}中安裝新的內核頭文件。在測試程序編譯期間,根據您使用的構建系統,您可能需要使用-I/usr/local/include前綴gcc/clang。

+0

感謝您的回答!完全用新內核替換整個較舊的內核頭文件是否可行?我使用'make headers_install'命令,輸出是「CHK include/generated/uapi/linux/version.h INSTALL usr/include/linux /(411 files)」。它將所有文件安裝在'/ usr/include/linux'目錄中。 –

+0

您可以使用/ usr作爲INSTALL_HDR_PATH的參數。如何使用headers_install的更好的解釋是:http://lxr.free-electrons.com/source/Documentation/kbuild/headers_install.txt。但是,我相信「/ usr/include」的例子是錯誤的,因爲在我的實驗中創建了/ usr/include/include。 –

+0

但是,請注意,這裏有相互矛盾的答案,有些人在使用/ usr作爲參數時報告了問題。 http://www.linuxquestions.org/questions/linux-newbie-8/make-headers_install-deleted-header-files-944363/ –

0

您的新安裝的內核支持SO_ATTACH_BPF,但您目前的libc軟件包現在還沒有(如您所述,發行版的本機3.10.0內核缺少給定的選項支持)。

您還需要更新libc軟件包,以便在用戶空間程序中使用新內核的功能。

+0

'''在'libc'中?不是內核頭文件? –

+0

'libc'擁有包含文件的**副本**,在內核和用戶之間共享。在內核中,這些文件放在'include/uapi /'和'arch//include/uapi /'下。 – Tsyvarev

+0

我的'libc'版本是'2.17'。我怎麼知道哪個'libc'支持'SO_ATTACH_BPF'? –