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
BPFプログラムを含むオブジェクトファイルを参照していますが、そのsock_example.o
オブジェクトファイルは実際には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ブートチュートリアル。