将 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.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 引导教程

相关内容