Неявное объявление функции 'bpf'
Я недавно изучал BPF, но это не происходит из-за очень основной проблемы.
Я включил linux/bpf.h, как описано в man bpf(2), но GCC не может найти функцию bpf. Этот код предназначен только для проверки того, что GCC может найти функцию bpf.
#include <linux/bpf.h>
int main()
{
bpf(0,(void *)0,0);
return 0;
}
GCC вывод это.
$ gcc -o test bpf.c
bpf.c: In function ‘main’:
bpf.c:5:2: warning: implicit declaration of function ‘bpf’ [-Wimplicit-function-declaration]
bpf(0,(void *)0,0);
^~~
/usr/bin/ld: /tmp/cc4tjrUh.o: in function `main':
bpf.c:(.text+0x19): undefined reference to `bpf'
collect2: error: ld returned 1 exit status
Я использую Archlinux и Linux версии ядра 4.20.11-arch1-1-ARCH. Пожалуйста, помогите мне, как включить функцию bpf.
1 ответ
Страница руководства документирует системный вызов bpf
, Хотя это не интуитивно понятно, на самом деле в заголовке нет определенной функции <linux/bpf.h>
это просто называется bpf()
, Вместо этого вы можете сделать косвенный системный вызов с syscall(__NR_bpf, ...)
(смотрите также man syscall
).
Проекты, использующие этот системный вызов, часто определяют оболочку, которая выглядит следующим образом:
int bpf(enum bpf_cmd cmd, union bpf_attr *attr, unsigned int size)
{
return syscall(__NR_bpf, cmd, attr, size);
}
Вот пример из libbpf.