如何构建 Linux 内核以支持 SO_ATTACH_BPF 套接字选项?

How to build Linux kernel to support SO_ATTACH_BPF socket option?

我想在 CentOS 7 上构建一个支持 eBPF 的应用程序(内核版本是 3.10.0):

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 套接字选项?

您新安装的内核支持 SO_ATTACH_BPF,但您当前的 libc 软件包现在不支持(正如您提到的,发行版的本机 3.10.0 内核缺少给定的选项支持)。

您还需要更新 libc 软件包,以便在用户 space 程序中使用新内核的功能。

在我基于 Fedora 21 的设置中,我使用与您链接的步骤非常相似的步骤来编译和安装最新的内核。作为附加步骤,我将从内核构建树执行以下操作,将内核头文件安装到 /usr/local/include:

sudo make INSTALL_HDR_PATH=/usr/local headers_install

这将导致现有内核头文件保留安装在 /usr/include/{linux,asm,asm-generic,...} 中,而新内核头文件安装在 /usr/local/include/{linux,asm,asm-generic,...} 中。在您的测试程序编译期间,根据您使用的构建系统,您可能需要在 gcc/clang 前添加 -I/usr/local/include.