Я получил это сообщение об ошибке в Ubuntu 19.04, когда я пытаюсь выполнить sudo ./mineonlyret
, которая является программой пользовательского пространства, которая загружает программу 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
ldd mineonlyret
)? Это в вашем кеше ldconfig (ldconfig -p
)? - person Qeole   schedule 18.11.2019-g
с clang (v8+) при компиляции, если вы хотите BTF. Также вы пытались удалить флаг-S
, это что-то меняет? Я думал попробовать более новую версию clang (см. репозиторий LLVM APT), а не более старую, если у вас есть возможность. - person Qeole   schedule 20.11.2019