Ebpf:帮助程序的未定义符号

Ebpf:undefined symbol for helpers

本文关键字:未定义 符号 帮助程序 Ebpf      更新时间:2023-10-16

我运行最新的 debian 测试(使用内核 4.19(。

在我的系统上找不到助手(但它们存在于标题中,Qt跳转到它们(

#include "bpf/bpf.h"
int main (){
        int r = bpf_create_map(BPF_MAP_TYPE_ARRAY,1,1,1,0);
        return 0;
}

编译结果为

undefined reference to `bpf_create_map(bpf_map_type, int, int, int, unsigned int)'

编译方式

g++ -c -pipe -g -std=gnu++1z -Wall -W -fPIC -DQT_QML_DEBUG -I. -I../../Qt/5.13.0/gcc_64/mkspecs/linux-g++ -o main.o main.cpp
g++ -lbpf -o server main.o  

g++ main.cpp -lbpf -o out

我也安装了libbpf-dev,并且有相关的库(等等(。

怎么了?

更新

即使以下代码也不起作用

#include <linux/bpf.h>
int main (){
        //int r = bpf_create_map(BPF_MAP_TYPE_ARRAY,1,1,1,0);
        bpf_attr attr = {};
        attr.map_type    = BPF_MAP_TYPE_ARRAY;
        attr.key_size    = 1;
        attr.value_size  = 1;
        attr.max_entries = 1;
        bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
        return 0;
}

结果在

error: 'bpf' was not declared in this scope

更新2:

顺便说一句,密钥大小强制要求为 4 而不是 1;但这是一点,这与我在这里的问题无关。

由于在C++中编译而导致的命名空间问题,您可能需要:

extern "C" {
#include "bpf/bpf.h"
}
int main()...

关于您的第二个错误(error: 'bpf' was not declared in this scope(,这与libbpf没有直接关系,这是因为没有简单地调用bpf()函数来实际执行系统调用。相反,您必须使用系统呼叫号码。例如,libbpf 定义了以下内容:

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

。并在之后使用sys_bpf(),就像您尝试在示例中调用bpf()一样。

作为记录,"BPF 帮助程序"通常指定从 BPF 程序中调用的 BPF 函数,但此处的情况并非如此。因此,我相信评论中存在一些混乱。