【问题标题】:Ebpf:undefined symbol for helpersEbpf:助手的未定义符号
【发布时间】:2019-07-26 07:20:39
【问题描述】:

我运行最新的 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 并且我有相关的库(a 等等)。

怎么了?

更新

即使下面的代码也行不通

#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;但这是一个问题,这与我的问题无关。

【问题讨论】:

  • 你确定bpf_create_map 是助手的一部分吗?因为我在手册页中找不到它。
  • 使用 GCC 和标准的 Linux 链接器,链接时在命令行上的目标文件和库的顺序很重要。如果目标文件A.o 依赖于库B,则A.o 必须B 之前。因此,您显示的最后一个命令应该可以工作如果该函数实际上存在于该库中。
  • 此外,阅读the BPF manual page 并没有提及要链接的库或包含的头文件。

标签: c++ linux ebpf


【解决方案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 函数,但这里不是这种情况。因此,我相信 cmets 会有些混乱。

【讨论】:

  • 啊,你是对的,添加 extern C{] 解决了这个问题。我的第一个代码现在编译得很好。
猜你喜欢
  • 2022-12-16
  • 2014-03-28
  • 1970-01-01
  • 2015-10-18
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多