ebpf相关介绍可参考:Linux 内核观测技术 BPF(书籍) - 知乎
目前对于ebpf介绍的资料很多,但实际的开发案例并不算多,正好最近在研究如何实现用户态程序的函数跟踪,所以就记录下自己的心得,希望对有需要的同学有所启发。
开发环境构建:
linux 5.4或者更高
cmake 3.14
llvm/clang 17.0.0: https://github.com/llvm/llvm-project.git
gcc8.3.1
libbpf github master分支源码 https://github.com/libbpf/libbpf
1.cmake安装
源码包下载后解压,到源码目录下执行./configure --prefix=/data/xxxx
make -j 20 && make install
2.安装llvm/clang
下载源码,进入源码目录,执行:
mkdir build && cd build
cmake -DCMAK_INSTALL_PREFIX=/xxx/clang -DCMAK_BUILD_TYPE=Debug -DCMAK_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ../llvm
make -j 8 install-clang-tidy
make j1 install
更新path: PATH=/xxx/xxx/llvm-project/build/bin:$PATH
3.安装libbpf
github下载源码后进入源码目录下:
先安装依赖:yum install -y elfutils-libelf-devel
cd libbpf/src && make && make install
环境搭建完成,下载BCC代码:git clone https://github.com/iovisor/bcc.git
git submodule update --init --recursive
接下来就可以可以在bcc/libbpf-tools目录下进行开发了
可以先试着编译下里面原有的case,确保环境没有问题,再做开发:
(1)bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
(2)clang -g -o2 -target bpf -D_TARGET_ARCH_x86 -lx86 -l ../src/cc/libbpf/include/uapi -c xxx.bpf.c -o xxx.bpf.o
(3)llvm-strip xxx.bpf.o --no-strip-all -R .BTP
(4)bpftool gen skeleton xxx.bpf.o > xxx.skel.h
(5)gcc -g -Wall xxx.c -lelf -lbpf -lz -o xxx
如果没有报错,说明环境ok