函数 'bpf' 的隐式声明

R00*_*T3D 5 bpf ebpf

我最近一直在研究 BPF,但由于一个非常基本的问题,它没有继续进行。

我按照 man bpf(2) 中的描述包含了 linux/bpf.h,但是 GCC 找不到 bpf 函数。此代码仅用于测试以确保 GCC 可以找到 bpf 函数。

#include <linux/bpf.h>

int main()
{
    bpf(0,(void *)0,0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC 输出是这样的。

$ gcc -o test bpf.c
bpf.c: In function ‘main’:
bpf.c:5:2: warning: implicit declaration of function ‘bpf’ [-Wimplicit-function-declaration]
  bpf(0,(void *)0,0);
  ^~~
/usr/bin/ld: /tmp/cc4tjrUh.o: in function `main':
bpf.c:(.text+0x19): undefined reference to `bpf'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我使用的是 Archlinux,Linux 内核版本是 4.20.11-arch1-1-ARCH。请帮助我如何包含 bpf 功能。

Qeo*_*ole 5

手册页记录了系统调用bpf。虽然这并不直观,但实际上头文件<linux/bpf.h>中没有定义简单调用的函数bpf()。相反,您可以使用syscall(__NR_bpf, ...)(另请参阅man syscall)进行间接系统调用。

依赖此系统调用的项目通常定义一个如下所示的包装器:

int bpf(enum bpf_cmd cmd, union bpf_attr *attr, unsigned int size)
{
    return syscall(__NR_bpf, cmd, attr, size);
}
Run Code Online (Sandbox Code Playgroud)

这是来自 libbpf 的示例