如何构建 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
.
我想在 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
.