2017-12-19 43 views
1

カーネルは、samples/bpfにいくつかの例を提供しています。 Makefileで十分に単純なカーネルモジュールを構築するのと同じように、ツリーの外側の例を構築することに興味があります。同じことをbpfで行うことは可能ですか?私はsamples/bpf/Makefileから不要な部分を取り除き、依存関係をlibbpfなどに保存してみましたが、それほど簡単ではありませんでした。例えばカーネルツリーからBPFプログラムを構築する方法

、(私はサンプル/ BPF/Makefileのと同様に、make samples/bpf V=1の出力に覗く)次のコマンドラインで、カーネルツリーのsamples/bpf/bpf_tcp_kern.c外を構築しようとしている:

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

ユーザーサイドのbpfアプリケーションを構築するには、libbpfが必要です。この部分はうまくいきます。

何か不足していますか?私はこの作業がかなり簡単だと信じています;-)

答えて

4

これは "eBPF"と仮定します。はい、可能です。基本的に、あなたはこのようなもので、最も単純なeBPFプログラムをコンパイルすることができるはずです。

clang -O2 -emit-llvm -c bpf.c -o - | llc -march=bpf -filetype=obj -o bpf.o 

あなたのプログラムは、ローカルのヘッダファイルから定義を使用している場合はもちろん

、(tc-bpf(8)のmanページから取られた)、おそれらを含める方法を見つけなければなりません(たとえあなたが他のものを "取り除いたとしても、それらのヘッダーからファイルをコンパイルするのに十分です)。

いくつかの注意:

  • 打ち鳴らすとLLVM(LLC)は、バージョン3.7以上(より良い高)にする必要があります。
  • コンパイルしようとしているeBPF機能によっては、プログラムをサポートできるだけの最新のカーネルヘッダ(特に<linux/bpf.h>)が必要です(this pageも参照)。
  • あなたが使用する予定の内容がわからないlibbpf私が正しく覚えていれば、eBPFプログラム自体には含まれないように、外部プログラムからeBPFプログラムをロードして管理するのに使われていますか?
  • [編集]samples/bpfのeBPFプログラムも、カーネルモジュールのインフラストラクチャで構築されているようです。彼らはであり、モジュール自体はではありませんが、カーネルヘッダーにアクセスしているかのようにコンパイルされています。あなたがツリーの外とカーネルのmakefileせずにそれらをコンパイルしようとするのであれば、あなたは<linux/*.h>ヘッダーへのアクセスを失う、と代わりに<linux/*.h><uapi/linux/*.h>を交換する必要があります。..一般的なアドバイスとして

にしてみてくださいコンパイルするまでプログラムを単純化してから、機能をもう一度追加してください:)。ソースコードやエラーメッセージなしでもっとあなたを助けることはできません。がんばろう!

[編集質問自体が更新された後] 私はコマンドに次の3行を追加することにより、例をコンパイルすることができましたが(あなたがそれらをトリミングしたり、あなたが持っている場合かどうかわからない、make samples/bpf/tcp_bufs_kern.o V=1を実行して、それらを得ました何か違う):

… 
-I/home/mark/work/net-next.git/include/generated/uapi \ 
-I/home/mark/work/net-next.git/tools/testing/selftests/bpf/ \ 
-include /home/mark/work/net-next.git/include/linux/kconfig.h \ 
… 

あなたのコマンドが不平を言うヘッダーの最初の行。 2行目は"bpf-helpers.h"のため、作業ディレクトリに簡単にコピーすることができます。最後の行は削除するのが難しいかもしれませんが、なぜkconfig.hが必要なのか詳細を調べなかったので、それについて調べる必要があります。

+0

私の 'Makefile'には実際に' include/generated/uapi'が含まれていますが、 'linux/kconfig.h'が見つからないという問題がありました。ありがとう。 – Mark

+0

もう1つの追加リソース: 'kernel/sample/bpf /'にあるMakefileは、サンプルをビルドするために、カーネルツリーの外に作成されているようです:[link](https://github.com/netoptimizer/prototype-kernel/blob/master/kernel/samples/bpf/Makefile) – Qeole

関連する問題