Ebpf:帮助程序的未定义符号
Ebpf:undefined symbol for helpers
我运行最新的 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 函数,但此处的情况并非如此。因此,我相信评论中存在一些混乱。
相关文章:
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: