建工教育网校官方网站,企业网站建站 广州 视频,答题网站怎么做,财经大学网站建设1.为什么移植
疑惑
起初我也认为#xff0c;像libbpf-bootstrap这样在ebpf程序开发中很常用的框架#xff0c;理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码#xff0c;各个内核上的ebpf虚拟机大同小异#xf…1.为什么移植
疑惑
起初我也认为像libbpf-bootstrap这样在ebpf程序开发中很常用的框架理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码各个内核上的ebpf虚拟机大同小异对于字节码大概率是兼容的。那么问题就落在用户态程序生成上面。
加载器
由于libbpf-bootstrap框架使用bpftools将xxx.bpf.c生成为xxx.skel.h再注入到用户态xx.c程序当中因此用户态程序本身就是字节码的加载器。基于安卓的ebpf开发也有不少前辈探索过如下图 图源eBPF on Android之stackplz从0到1 - SeeFlowerX ps:强推他的安卓package用户态程序堆栈追踪工具我的不少灵感也来自于他的开发过程在此谢过SeeFlowerX前辈了。 最终他选择的解决方案是golang的ebpf生态交叉编译相当方便。但我面临的是性能的需要我还是打算折腾一下纯C的开发生态但是AOSP又实在太过庞大且面临API变动会使我们很头疼。
2.使用方法 准备
Android NDKgcc-aarch64-linux-gnuAndroid phone with root and unlock BL
安装依赖
git clone https://github.com/JiaHuann/libbpf-bootstrap-android
cd libbpf-bootstrap-android
sudo apt install gcc-aarch64-linux-gnu llvm clang
wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip?hlzh-cn android-ndk-r25c-linux.zip
unzip android-ndk-r25c-linux
设置环境变量
vim ~/.bashrc
export your android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin to PATH
编译和推送
cd examples/c makeadb devices
adb remount # may fail, you can leave with issure.
adb push examples/c/btf_file/* example/c/your_executable_file /data/local/tmp
adb shell #into android kernel shell
安卓shell操作
cd /data/local/tmp chmod x your_excutable_file
./run
Congratulations! 运行效果如下 资料直通车Linux内核源码技术学习路线视频教程内核源码 学习直通车Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈 3.针对安卓的特性
libelf,libz on aarch64 embedded.x86 - android13(aarch64) cross-compile you can directly write ebpf both kernel-program and user-program on x86 machine.FlameGraph embedded to monitor performance.For None BTF/vmlinux android-kernel(CONFIG_DEBUG_INFO_BTF not set) support.adb debug (after compilinglinking, directly push into android-phone) embedded.
4.移植过程
寻找方案
于是我继续折腾libbpf-bootstrap的交叉编译好巧不巧在How to cross-compile programs from amd64 to arm64 · Issue #144 · libbpf/libbpf-bootstrap · GitHub这个issure中也发现了这个问题显然直到现在还是open状态给出的maintainer给出的方案是
Yes, libbpf depends on libelf and libz, so you need declare where the libraries and header files can be found. such as, make EXTRA_CFLAGS-IXXX EXTRA_LDFLAGS-LXXX ARCHarm64. You can get a copy of these libraries from here for quickly verification if you dont want to cross-compile them yourself. 我寻思着也可行但是几经折腾后我发现了很多问题
Android NDK在r17已经宣称不支持gcc在r18已经删掉最新版的r25只有clang在使用NDK交叉编译时会遇到一堆莫名其妙的问题。我的开发机并没有打开CONFIG_DEBUG_BTF_INFO但是为了方便我想引入外部BTF file但是有些目录在android kernel并不可写。
解决
最终我在本地几经尝试交叉编译出了libbpf依赖的libelf以及libz,很有趣的是在编译的过程中我使用aarch64-linux-gnu竟然编出来的依赖竟然可以用。在libbpf-bootstrap中想到用户态程序可能也没有太多编译上的新特性于是我继续使用aarch64-linux-gnu交叉编译果然还是可行。最终aarch64的可执行文件还是编译了出来。
为了优化大家的开发速度和不再折腾这个过程我将所有的细节依赖都合并了起来并且修改了libbpf源码加入了外部BTF文件路径且在repo中放入了一个a13-5.10的btf 文件我写定了路径为/data/local/tmp,push到这里就可以使用。关于这个btf版本问题我的内核是5.4但是目前使用起来尚未发现问题。GitHub - JiaHuann/libbpf-bootstrap-android: Do something to fit android aarch64 to develop ebpf programs using libbpf-bootstrap framework
至此可以ebpf程序源码可以无需任何改动就运行在安卓kernel当然有一些kernel版本决定的特性和api还是会限制的这个与是否交叉编译运行无关
PS:当初为了验证是否可行全是草率的静态链接的生成的可执行文件可能会有点大后续即将马上修改为动态链接。
当然如果有条件还是使用arm虚拟机或者qemu开发吧交叉编译确实不好折腾: (当我还在折腾的时候我同学的mac已经能run了 原文作者Linux内核之旅