Ядро предоставляет ряд примеров в samples/bpf
. Я заинтересован в сборке одного из примеров вне дерева, точно так же, как мы собираем модуль ядра, где Makefile
может быть достаточно простым. Можно ли сделать то же самое с bpf? Я попробовал это, вырвав ненужные части из samples/bpf/Makefile
и сохранив зависимости от libbpf
и других, однако это оказалось не так просто.
Например, попытка собрать samples/bpf/bpf_tcp_kern.c
вне дерева ядра с помощью следующей командной строки (я заглянул в sample/bpf/Makefile, а также вывод make samples/bpf V=1
):
clang -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/5/include \
-I/home/mark/work/net-next.git/arch/x86/include -I/home/mark/work/net-next.git/arch/x86/include/generated -I./include -I/home/mark/work/net-next.git/arch/x86/include/uapi -I/home/mark/work/net-next.git/arch/x86/include/generated/uapi -I/home/mark/work/net-next.git/include -I/home/mark/work/net-next.git/generated/uapi -I./ \
-D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \
-D__TARGET_ARCH_x86 -Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-address-of-packed-member -Wno-tautological-compare \
-Wno-unknown-warning-option \
-O2 -emit-llvm -c bpf_tcp_kern.c -o -| llc -march=bpf -filetype=obj -o bpf_tcp_kern.o
In file included from bpf_tcp_kern.c:15:
In file included from /home/mark/work/net-next.git/include/uapi/linux/bpf.h:11:
In file included from /home/mark/work/net-next.git/include/linux/types.h:6:
In file included from /home/mark/work/net-next.git/include/uapi/linux/types.h:5:
/home/mark/work/net-next.git/arch/x86/include/uapi/asm/types.h:5:10: fatal error: 'asm-generic/types.h' file not found
#include <asm-generic/types.h>
^
1 error generated
Это с clang-llvm 3.8.0
И мне нужно libbpf
для создания приложений bpf на стороне пользователя. Эта часть работает, строит просто отлично.
Я что-то упускаю? Я считаю, что эта задача должна быть довольно простой ;-)