ebpf 프로그램을 커널에 로드하는 중에 오류가 발생했습니다.

ebpf 프로그램을 커널에 로드하는 중에 오류가 발생했습니다.

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.cBPF 프로그램이 포함된 개체 파일을 참조하고 있지만 해당 sock_example.o개체 파일은 실제로 ebpf_prog.o.

답변2

귀하의 프로그램 은 ebpf_prog.c유효한 eBPF 프로그램이 아니지만 귀하 의 load_prog.c.ebpf_prog.osock_example.o

가장 큰 실수는 ELF 바이너리로 빌드한다는 것입니다. eBPF 프로그램은 eBPF 바이트코드로 빌드해야 합니다.

clang -target bpf ...

libbpf를 사용하고 있으므로 다음을 참조하세요.libbpf 부팅 튜토리얼.

관련 정보