неявное объявление функции 'bpf' - PullRequest
0 голосов
/ 22 февраля 2019

Я недавно изучал 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, и версия ядра Linux4.20.11-arch1-1-ARCH.Пожалуйста, помогите мне, как включить функцию bpf.

1 Ответ

0 голосов
/ 22 февраля 2019

Страница справочника документирует системный вызов 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 .

...