Mar*_*ark 5 jit linux-kernel llvm-clang bpf
内核在中提供了许多示例samples/bpf。我有兴趣在树外构建示例之一,就像我们构建一个内核模块一样,其中Makefile足够简单。bpf是否可以做同样的事情?我尝试通过从中删除不必要的部分samples/bpf/Makefile并保持对libbpf其他对象的依赖来进行尝试,但是事实并非如此简单。
例如,尝试samples/bpf/bpf_tcp_kern.c使用以下命令行在内核树之外进行构建(我窥视了samples / 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
Run Code Online (Sandbox Code Playgroud)
这是 clang-llvm 3.8.0
而且我需要libbpf构建用户端bpf应用程序。这部分作品构建良好。
我想念什么吗?我相信这个任务应该很容易;-)
假设这是“ eBPF”。是的,那应该可行。基本上,您应该可以使用以下代码来编译最简单的eBPF程序:
clang -O2 -emit-llvm -c bpf.c -o - | llc -march=bpf -filetype=obj -o bpf.o
Run Code Online (Sandbox Code Playgroud)
(摘自的手册页tc-bpf(8))
当然,如果您的程序使用本地头文件中的定义,则必须找到一种包含它们的方法(即,即使您“删除”其他所有内容,也要保留这些头中的足够内容以进行文件编译)。
一些注意事项:
<linux/bpf.h>)足够新,以支持您的程序(另请参阅此页面)。libbpf。如果我没记错的话,它是用于从外部程序加载和管理eBPF程序,而不是包含在eBPF程序本身中吗?samples/bpf似乎也使用内核模块基础结构构建。它们本身不是模块,而是以某种方式进行编译,就好像它们可以访问内核标头一样。因此,如果您尝试在树之外且没有内核makefile的情况下编译它们,则可能会失去对头文件的访问<linux/*.h>,而必须替换<uapi/linux/*.h>by <linux/*.h>。作为一般建议,请尝试简化程序,直到编译为止,然后再次添加功能:)。恐怕没有源代码或错误消息也无法真正为您提供更多帮助。祝好运!
[ 在问题本身更新后进行编辑 ]我可以通过在命令中添加以下三行来编译示例(通过运行来获取它们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 \
…
Run Code Online (Sandbox Code Playgroud)
asm-generic.h您的命令抱怨的标题的第一行;第二行是"bpf-helpers.h",您可以轻松地将其复制到工作目录中。最后一行可能很难删除,我没有详细搜索为什么kconfig.h需要这样做,因此您必须对此进行调查。
| 归档时间: |
|
| 查看次数: |
2341 次 |
| 最近记录: |