【问题标题】:implicit declaration of function ‘bpf’函数‘bpf’的隐式声明
【发布时间】:2019-07-16 06:02:55
【问题描述】:

最近一直在研究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 功能。

【问题讨论】:

    标签: bpf ebpf


    【解决方案1】:

    手册页记录了系统调用bpf。虽然这并不直观,但实际上在标题 &lt;linux/bpf.h&gt; 中没有定义任何函数,简称为 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);
    }
    

    这里是an example from libbpf

    【讨论】:

    • 终于成功了!非常感谢。顺便说一句,一些例子使用了类似 BPF_MOV64_IMM 宏的东西,但它没有在 linux/bpf.h 中定义。我该如何使用它?
    • 我不相信这些宏会暴露给用户空间。它们在kernel header 中定义,因此内核代码可以访问它们。内核源代码link to it (LINUXINCLUDE) 中的示例。 Libbpf 和 co 也确实使用了宏,但他们将其导出为 in a header under tools/,它不会被复制并在系统级别提供。
    • 我明白了。感谢您的详细解答。
    猜你喜欢
    • 2019-02-08
    • 2021-01-20
    • 1970-01-01
    • 2014-06-28
    • 2022-01-16
    • 2011-10-05
    • 2013-10-28
    • 2017-07-16
    相关资源
    最近更新 更多