在 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 &lt;bpf_load.h&gt;的错误 我应该在我的系统上的编译命令中查找这个文件 我想我找到了答案lwn.net/Articles/625233 bpf_load.h 不是 libbpf 的一部分,它是作为内核示例一部分的替代(且已弃用)加载程序的标头。您可能想改用 libbpf,请参阅 its documentation。 ctx->data 包含什么?你知道吗?

以上是关于在 ubuntu clang 和 llvm 中编译扩展的 berkley 数据包过滤器程序,安装 libbpf 还安装了 bt helper func not found&formar 错误的主要内容,如果未能解决你的问题,请参考以下文章

编译器:gcc, clang, llvm

OS X 上的 LLVM 与 clang

DevC++怎么加载llvm的clang?

强制函数在Clang / LLVM中内联

clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS

LLVM和clang