1

目標:スタンドアロンを使用して、カーネル ツリーの外部で ebpf プログラムをビルドしlibbpfclang

問題:次の手順に従いました

1) ビルドlibbpf

git clone https://github.com/libbpf/libbpf.git
cd src
make

bpf_helpers.h2)カーネル src からコピー/tools/testing/selftests/bpf/bpf_helpers.h

3) でコンパイル

clang -S -I. -O2 -Wall -Werror -emit-llvm -c mine_kern.c -o - | llc -march=bpf -filetype=obj -o mine_kern.o

bpf_helpers.hしかし、その結果、コンテンツに関連する多くのエラーが発生しました。例えば

In file included from mine_kern.c:7:
./bpf_helpers.h:75:11: error: use of undeclared identifier
      'BPF_FUNC_sock_ops_cb_flags_set'
        (void *) BPF_FUNC_sock_ops_cb_flags_set;
                 ^

mine_kern.c

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/ip.h>
#include <linux/in.h>    
#include "bpf_helpers.h"

SEC("socket")
int bpfrog1(struct __sk_buff *skb)
{
        int proto = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol));

        if (proto == IPPROTO_ICMP && skb->pkt_type == PACKET_OUTGOING)
                return -1;
        else
                return 0;

}
char _license[] SEC("license") = "GPL";

質問:

プロジェクト ツリーは次のとおりです。

libbpf
  |src
    |libbpf.a
    |libbpf.so
    |...
libbpfebpf
  |bpf_headers.h
  |mine_kern.c
  |mine_user.c

どうすればエラーを修正できますか? _user.c修正後、コンパイルしgcc-L../libbpf/srcリンクするには十分libbpf.soですか?

4

1 に答える 1

1

どのカーネルを実行していますか? bpf_sock_ops_cb_flags_set()BPF ヘルパーがカーネルでサポートされていないようです ( にありません/usr/include/linux/bpf.h)。これは Linux 4.17 で追加されたので、カーネルがこれよりも古い場合は、その定義 (および後続のすべてのヘルパー) をbpf_helpers.h. これらの最新のヘルパーを使用するつもりでない限り、プログラムをコンパイルする上で問題になることはありません。

または、カーネルをアップグレードします。

-Lはい、フラグを gcc に渡して、libbpf の場所を指定するだけで十分だと思います。

于 2019-08-01T14:25:29.217 に答える