Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libbpf:加载ELF节时出错。BTF:0_C_Elf_Bpf_Ebpf - Fatal编程技术网

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

C libbpf:加载ELF节时出错。BTF:0,c,elf,bpf,ebpf,C,Elf,Bpf,Ebpf,当我试图执行sudo./mineonlyret时,我在ubuntu 19.04上收到了这个错误消息,这是一个用户空间程序,它加载了一个ebpf程序,后面将对此进行描述。我在Ubuntu18.04上尝试了相同的配置,并且没有出现错误。哪个可能是导致此错误的原因? 如果你需要更多的细节,请告诉我 libbpf: Error loading ELF section .BTF: 0. MineOnlyNet\u user.c // SPDX-License-Identifier: GPL-2.0 #i

当我试图执行
sudo./mineonlyret
时,我在ubuntu 19.04上收到了这个错误消息,这是一个用户空间程序,它加载了一个ebpf程序,后面将对此进行描述。我在Ubuntu18.04上尝试了相同的配置,并且没有出现错误。哪个可能是导致此错误的原因? 如果你需要更多的细节,请告诉我

libbpf: Error loading ELF section .BTF: 0.
MineOnlyNet\u 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;
}
#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";
以及带有

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

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

它可能来自两台计算机之间的clang版本差异,也许?您使用什么版本?关于共享库,您会遇到什么错误?你使用的libbpf版本是什么?UBUNTU:18.04 clang version 6.0.0-1ubuntu2(tags/RELEASE_600/final)libbpf我想是0.0.3(我在10月之前克隆了存储库)UBUNTU:19.04 clang version 8.0.0-3(tags/RELEASE_800/final)libbpf我想是0.0.5(我昨天克隆了存储库)当我执行gcc-o mineonleyret mineonleyret_user.c-I../libbpf/src-L../libbpf/src/-lbpf时,似乎编译得很好。但是当我执行程序时。/mineonlyret我得到了错误:加载共享库时出错:libbpf.so.0:无法打开共享对象文件:没有这样的文件或目录(如果我使用.a为共享库内容编译,则不会显示错误:看起来您的系统找不到共享库。您是否编译了libbpf.so并将其安装到系统上?如果是,它是否位于二进制文件所期望的位置(
ldd mineonlyret
)?它是否在您的ldconfig缓存中(
ldconfig-p
)?不确定您的libbpf ELF/BTF错误。这可能是因为clang和libbpf版本之间的兼容性问题,因为在数据实际发送到内核之前,当lib解析您的对象文件时,它会命中(因此独立于内核或Ubuntu版本)。但除此之外,我不确定。我的建议是尝试旧的libbpf或更新的clang。如果libbpf可以继续,您很可能会忽略此错误,BTF用于调试。请参阅。使用带有clang的
-g
标志(v8+)编译时,如果你想要BTF。你也尝试过删除
-S
标志,它会改变什么吗?我在考虑尝试更新版本的clang(请参阅),而不是旧版本,如果你有可能的话。
.
├── libbpf
│   ├── include
│   ├── src
│   │   ├── libbpf.so
│   │   └── libbpf.a
└── libbpfebpf
    |── mineonlyret_user.c
    |── mineonlyret_kern.c