2015-06-09 130 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'? –