函数“ bpf”的隐式声明

时间:2019-02-22 07:27:04

标签: 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;
}

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

我正在使用Archlinux,Linux内核版本是4.20.11-arch1-1-ARCH。 请帮助我如何包括bpf函数。

1 个答案:

答案 0 :(得分:2)

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

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

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

这里是an example from libbpf