为什么当我想将 ebpf 程序加载到内核时出现此错误?
ebpf_prog.c:
#include <bpf/bpf_helpers.h>
#include <bpf/libbpf.h>
int main(int argc, char **argv) {
struct bpf_object *obj;
int map_fd, prog_fd;
int i, sock;
FILE *f;
if (bpf_prog_load("ebpf_prog.o", BPF_PROG_TYPE_SOCKET_FILTER, &obj, &prog_fd)){
printf("The kernel didn't load the BPF program\n");
return -1;
}
return 0;
}
加载程序.c:
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <bpf/libbpf.h>
int main(int argc, char **argv) {
struct bpf_object *obj;
int map_fd, prog_fd;
int i, sock;
FILE *f;
if (bpf_prog_load("ebpf_prog.o", BPF_PROG_TYPE_SOCKET_FILTER, &obj, &prog_fd)){
printf("The kernel didn't load the BPF program\n");
return -1;
}
return 0;
}
错误:
$ gcc ebpf_prog.c -c -o ebpf_prog.o
$ gcc load_prog.c -o load_prog -lbpf
$ ./load_prog
libbpf: elf: sock_example.o is not a valid eBPF object file
The kernel didn't load the BPF program
我的代码有什么问题吗?
答案1
您load_prog.c
指的sock_example.o
是包含 BPF 程序的目标文件,但该目标文件实际上称为ebpf_prog.o
.
答案2
您的ebpf_prog.c
不是有效的 eBPF 程序,但这可能只是复制粘贴错误,因为它与您的load_prog.c
. (我假设ebpf_prog.o
/sock_example.o
不匹配也是复制粘贴错误。)
主要错误是您将其构建为 ELF 二进制文件; eBPF 程序需要构建为 eBPF 字节代码:
clang -target bpf ...
由于您使用的是 libbpf,请参阅libbpf 引导教程。