在内核树之外编译 ebpf _kern.c 和 link 独立的 libbpf 到 _user.c
Compile ebpf _kern.c outside the kernel tree and link stand alone libbpf to _user.c
目标: 使用独立 libbpf
和 clang
在内核树之外构建一个 ebpf 程序
问题:我遵循了这些步骤
1) 建造 libbpf
git clone https://github.com/libbpf/libbpf.git
cd src
make
2) 从我的内核 src /tools/testing/selftests/bpf/bpf_helpers.h
复制 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
编译为 link libbpf.so
?
你是什么内核运行?您的内核似乎不支持 bpf_sock_ops_cb_flags_set()
BPF 助手(/usr/include/linux/bpf.h
中缺少)。它是在 Linux 4.17 中添加的,所以如果您的内核比这个版本旧,请从您的 bpf_helpers.h
中删除它的定义(以及所有后续的帮助程序)。编译你的程序应该不是问题,除非你打算使用那些更新的助手之一。
或者,升级您的内核。
是的,我认为将 -L
标志传递给 gcc 以告诉它在哪里可以找到 libbpf 就足够了。
目标: 使用独立 libbpf
和 clang
问题:我遵循了这些步骤
1) 建造 libbpf
git clone https://github.com/libbpf/libbpf.git
cd src
make
2) 从我的内核 src /tools/testing/selftests/bpf/bpf_helpers.h
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
编译为 link libbpf.so
?
你是什么内核运行?您的内核似乎不支持 bpf_sock_ops_cb_flags_set()
BPF 助手(/usr/include/linux/bpf.h
中缺少)。它是在 Linux 4.17 中添加的,所以如果您的内核比这个版本旧,请从您的 bpf_helpers.h
中删除它的定义(以及所有后续的帮助程序)。编译你的程序应该不是问题,除非你打算使用那些更新的助手之一。
或者,升级您的内核。
是的,我认为将 -L
标志传递给 gcc 以告诉它在哪里可以找到 libbpf 就足够了。