libbpf:加载ELF节时出错。BTF:0

时间:2019-11-18 11:55:02

标签: c elf bpf ebpf

当我尝试执行sudo ./mineonlyret时,我在ubuntu 19.04上收到此错误消息,这是一个加载ebpf程序的用户空间程序,其描述如下。我在ubuntu 18.04上尝试了相同的配置,但没有错误。可能是此错误的原因? 如果您需要更多详细信息,请告诉我。

libbpf: Error loading ELF section .BTF: 0.

mineonlyret_user.c

// SPDX-License-Identifier: GPL-2.0
#include <stdio.h>
#include <assert.h>
#include <linux/bpf.h>
#include "libbpf.h"
#include <unistd.h>
#include <arpa/inet.h>
#include <linux/if_ether.h>

int main(int ac, char **argv)
{
    int sock, prog_fd;
    struct bpf_object *obj;
    char filename[256];

    if (bpf_prog_load("mineonlyret_kern.o", BPF_PROG_TYPE_SOCKET_FILTER,
              &obj, &prog_fd))
        return 1;

    /* open up a packet socket */
    sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));  
    if(sock < 0){
        printf("socket");
        return -1;
    }

    /* attach the filter */
    assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd,
              sizeof(prog_fd)) == 0);

    int i;
        char buf[65535];
    for (i = 0; i < 5; i++) {
        printf("ci\n");
            int res = recvfrom(sock, buf, sizeof(buf), 0, NULL, 0);
            printf("res=%d\n", res);

        sleep(5);
    }

    return 0;
}

mineonlyret_kern.c

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/in.h>
#include "bpf_helpers.h"
#include <stddef.h>
SEC("socket")
int bpf_sk_prog(struct __sk_buff *skb)
{

        return 0;

}
char _license[] SEC("license") = "GPL";

我用

编译_kern.c
clang -S -I. -O2 -emit-llvm -c mineonlyret_kern.c -o - | llc -march=bpf -filetype=obj -o mineonlyret_kern.o

和_user.c与

gcc  -o mineonlyret mineonlyret_user.c -I../libbpf/src/  ../libbpf/src/libbpf.a -lelf

在这里,我还有一个疑问:为什么如果使用库的共享版本,它将无法正常工作?我的意思是如果我执行

gcc  -o mineonlyret mineonlyret_user.c -I../libbpf/src/  -L../libbpf/src/ -lbpf

目录树

.
├── libbpf
│   ├── include
│   ├── src
│   │   ├── libbpf.so
│   │   └── libbpf.a
└── libbpfebpf
    |── mineonlyret_user.c
    |── mineonlyret_kern.c

1 个答案:

答案 0 :(得分:0)

您需要指定-g来请求Clang生成.BTF(它也会生成DWARF调试信息,但是您可以忽略或剥离它,libbpf不会使用它)。虽然.BTF最初是用于更好地调试和BPF程序集转储的可选附加信息,但它已成长为现代BPF应用程序(至少是那些使用libbpf的应用程序)中非常需要的部分,因此请确保始终使用-g指定。