在 ubuntu clang 和 llvm 中编译扩展的 berkley 数据包过滤器程序,安装 libbpf 还安装了 bt helper func not found&formar 错误
Posted
技术标签:
【中文标题】在 ubuntu clang 和 llvm 中编译扩展的 berkley 数据包过滤器程序,安装 libbpf 还安装了 bt helper func not found&formar 错误【英文标题】:compiling extended berkley packet filters program in ubuntu clang and llvm installed with libbpf also installed bt helper func not found& formar error 【发布时间】:2022-01-18 10:31:42 【问题描述】:所以我有 llvm、内核头文件 (5.14.1)、clang 和 libbpf,以及我从 linux 源代码复制 ebpf 程序目录中的 bpf_helpers.h。这是一个简单的程序,我喜欢在任何程序调用 execve
系统时加载并运行它
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include "bpf_helpers.h" // some helpers not found, why is that?
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("kprobe/execve")
int bpf_prog1(struct pt_regs *ctx)
char m[]="hello world";
bpf_trace_printk(m,sizeof(m));
return 0;
char _license[] SEC("license") = "GPL";
真的是一个简单的程序,
我用 clang 编译了程序,但是当我执行 llvm-objdump -S ./one.o
时,它给出的消息是无法识别的格式,
所以如果我的 llvm 不理解我的 .o 文件,我想知道这意味着什么。我可以忽略llvm-objdum的这个警告并继续使用ebpf加载程序加载.o文件,还是我创建.o文件并用clang编译的方式是错误的,所以在这种情况下有人可以告诉如何创建ebpf从 ebpf .c 文件中编写程序并使用加载程序加载它。
【问题讨论】:
load_bpf_file 辅助函数我也找不到如何为此包含头文件。应该从加载程序调用此函数以加载 ebpf .o 二进制文件 你用什么命令编译?file one.o
的输出是什么?这应该会给我们提供更多信息。
@caveman 命令是正确的。但是我遇到了 libbpf 的问题。我知道它已安装在我的系统上,但不知道在哪里可以找到它的确切标题。当我安装时,libbpf 的标头是否在系统上具有位置。像 bpf_helpers.h bpf_helper_defs.h 这样的标头。
【参考方案1】:
如果您在 Ubuntu 上运行并安装了 libbpf-dev
,您应该能够像这样包含 libbpf 标头:
#include <bpf/bpf_helpers.h>
和(在加载程序中):
#include <bpf/libbpf.h>
至于llvm-objdump
的抱怨,可能取决于您用于编译的命令。您是否通过了-t bpf
目标?你具体使用什么命令?
【讨论】:
我已经安装了libbpf-dev
现在它仍然给我user.c:5:10: fatal error: bpf_load.h: No such file or directory 5 | #include <bpf_load.h>
的错误
我应该在我的系统上的编译命令中查找这个文件
我想我找到了答案lwn.net/Articles/625233
bpf_load.h
不是 libbpf 的一部分,它是作为内核示例一部分的替代(且已弃用)加载程序的标头。您可能想改用 libbpf,请参阅 its documentation。
ctx->data 包含什么?你知道吗?以上是关于在 ubuntu clang 和 llvm 中编译扩展的 berkley 数据包过滤器程序,安装 libbpf 还安装了 bt helper func not found&formar 错误的主要内容,如果未能解决你的问题,请参考以下文章
clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS