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 부팅 튜토리얼.