程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

arm64极速编译bpftrace(arm_64bit 1)

balukai 2025-03-14 14:46:03 文章精选 17 ℃

bpftrace可以让开发者能够在不修改内核代码的情况下,安全且高效地对内核以及用户空间的运行时行为进行跟踪、分析和故障排查等操作,特别是系统方面的疑难杂症问题,可以说是分析利器!手机和车机系统一般都采用的arm64架构,这里主要介绍怎么快速编译arm64的bpftrace。

环境准备

首先需要云服务器,并且需要梯子,基于办公环境安全考虑,我这里推荐使用aliyun的ECS,选择流量型的,大概0.5/h,编译快的话1h就搞定了。服务器地址选择美国,不需要单独梯子了。我这里选择的是ubuntu20.04,ARM64架构的。

静态编译

由于动态库的方式比较简单,这里只介绍静态编译。文章写作日(20250122)最新版本为0.22.x,bpftrace编译方式在0.19.x发生了较大变化,version<=0.19.x官方推荐使用docker方式编译,而在version>=0.20.x官方推荐使用的是nix。编译的细节差异较大,这里也分别进行说明。编译方法已经提交到了github:bpftrace-llvm-arm64.

0.19.x版本

0.19.x版本使用的编译器llvm版本为12,bpftrace提供的docker镜像Dockerfile.ubuntu-glibc是x86架构的,需要修改成
liuxinquan/bpftrace-llvm-arm64:focal-glibc231。具体的修改patch可以查看:
bpftrace-static.patch。修改后可以直接运行build.sh脚本编译,等待完成即可。

diff --git a/build-docker-image.sh b/build-docker-image.sh
index cde302bd..2b48bb1f 100755
--- a/build-docker-image.sh
+++ b/build-docker-image.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
 set -eu
 pushd docker
  //  如果云服务器是arm64的,可以不用指定--platform
-docker build --network host -t bpftrace-builder-${BASE} --build-arg LLVM_VERSION=${LLVM_VERSION} -f Dockerfile.${BASE} .
+docker build --platform linux/arm64 --network host -t bpftrace-builder-${BASE} --build-arg LLVM_VERSION=${LLVM_VERSION} -f Dockerfile.${BASE} .
 popd
diff --git a/build.sh b/build.sh
index 4da38426..57e53c0a 100755
--- a/build.sh
+++ b/build.sh
@@ -2,6 +2,6 @@
 set -e
 export BASE=focal
 export LLVM_VERSION=12
-export RUN_TESTS=1
-./build-docker-image.sh
-./build-release.sh "$@"
+export RUN_TESTS=0
+#./build-docker-image.sh
+./build-static.sh "$@"       // 使用静态编译脚本
diff --git a/docker/Dockerfile.ubuntu-glibc b/docker/Dockerfile.ubuntu-glibc
index ee346908..3fb15038 100644
--- a/docker/Dockerfile.ubuntu-glibc
+++ b/docker/Dockerfile.ubuntu-glibc
@@ -1,6 +1,6 @@
 ARG BASE="bionic"
 ARG LLVM_VERSION="12"
// 修改成arm64的镜像
-FROM quay.io/iovisor/bpftrace-llvm:${BASE}_${LLVM_VERSION}
+FROM liuxinquan/bpftrace-llvm-arm64:focal-glibc231

0.21.x版本

最新版本的bpftrace要求llvm大于等于13,所以我提供了一个llvm14的镜像。编译脚本在bpftrace-arm64-0.21.x文件夹中build-static.sh。 对其中的文件进行说明下:

// 1.基础镜像bpftrace-llvm-arm64对应的dockerfile文件,编译不需要,只是提供参考。
Dockerfile-llvm14.arm64_focal
// 2.编译使用的dockerfile文件
Dockerfile-static.arm64
// 3.编译入口
build-static.sh
// 4. docker容器中用于真正编译bpftace脚本
make.sh

问题

疑问1:为啥要区分0.19和0.21

官方提供的编译方式变了,0.21推荐使用nix,而nix编译出来的二进制是基于alpine。采用的musl libc,而非常用的glibc。

疑问2:为啥提供了个不同的docker镜像。


liuxinquan/bpftrace-llvm-arm64和
liuxinquan/bpftrace-llvm14-arm64使用的llvm版本不一样,前者是12,后者是14,不同bpftrace版本的要求。每个镜像有2个标签focal-glibc231和jammy-glibc235,是由于glibc兼容性问题,glibc231对应的是glibc-2.31的版本,如果你的系统大于等于glibc2.31就可以使用,如果低于就会报找不到libc.so。而glibc235对应的版本为glibc-2.35。推荐使用glibc231,能兼容更多的系统。如果你的系统glibc版本低于2.31,可以尝试使用patchelf工具修改bpftrace中的libc版本(本人没有尝试过)。

疑问3:为啥静态链接生成的bpftrace还存在少量的so,如libc.so.6

系统中不存在这些静态库,并且这些库是系统必须的,不存在缺少情况,为了减少bpftrace的size,也可以使用动态库,不影响使用。

其他疑问可以留言

Tags:

最近发表
标签列表