当前位置: 首页 > news >正文

libbpf-bootstrap安卓aarch64适配交叉编译

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 NDK
  • gcc-aarch64-linux-gnu
  • Android 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?hl=zh-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 compiling&linking, 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" ARCH=arm64. You can get a copy of these libraries from here for quickly verification if you don't 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内核之旅

相关文章:

libbpf-bootstrap安卓aarch64适配交叉编译

1.为什么移植 疑惑 起初我也认为,像libbpf-bootstrap这样在ebpf程序开发中很常用的框架,理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码,各个内核上的ebpf虚拟机大同小异&#xf…...

【剑指Offer】24.反转链表

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制&#xff1a; 0 < 节点个数 < 5000 解答 源代码 /*** Defin…...

04-docker compose容器编排

Docker Compose简介 Docker Compose是什么 ​ Compose 是Docker公司推出的一个工具软件&#xff0c;可以管理多个Dokcer容器组成一个应用。你需要定义一个YAML格式的配置文件 docker-compose.yml&#xff0c;写好多个容器之间的调用关系。然后&#xff0c;只要一个命令&#…...

通过位运算打多个标记

通过位运算打多个标记 如何在一个字段上&#xff0c;记录多个标记&#xff1f; 如何在一个字段上&#xff0c;记录不同类型的多个标记&#xff1f; 如何用较少的字段&#xff0c;记录多个标记&#xff1f; 如何在不增加字段的要求下&#xff0c;记录新增的标记&#xff1f; 在实…...

[学习笔记]Node2Vec图神经网络论文精读

参考资料&#xff1a;https://www.bilibili.com/video/BV1BS4y1E7tf/?p12&spm_id_frompageDriver Node2vec简述 DeepWalk的缺点 用完全随机游走&#xff0c;训练节点嵌入向量&#xff0c;仅能反应相邻节点的社群相似信息&#xff0c;无法反映节点的功能角色相似信息。 …...

C# Linq源码分析之Take(五)

概要 本文在C# Linq源码分析之Take&#xff08;四&#xff09;的基础上继续从源码角度分析Take的优化方法&#xff0c;主要分析Where.Select.Take的使用案例。 Where.Select.Take的案例分析 该场景模拟我们显示中将EF中与数据库关联的对象进行过滤&#xff0c;然后转换成Web…...

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…...

(STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核

一、应用 工业&#xff08;PLC、工业电机控制、泵和压缩机&#xff09; 智能家居&#xff08;空调、冰箱、冰柜、中央警报系统、洗衣机&#xff09; 个人电子产品&#xff08;键盘、智能手机、物联网标签、跟踪设备&#xff09; 智能城市&#xff08;工业通信、照明控制、数字…...

mysql配置bind-address不生效

1、前言 因为要ip直接访问mysql&#xff0c;故去修改bind-address参数&#xff0c;按照mysql配置文件查找顺序是&#xff1a;/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf&#xff0c;服务器上没有 /etc/my.cnf文件&#xff0c;故去修改 /etc/mysql/my.cnf文件&#xff0c;但是一…...

Linux相关指令(下)

cat指令 查看目标文件的内容 常用选项&#xff1a; -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 一个重要思想&#xff1a;linux下一切皆文件&#xff0c;如显示器文件&#xff0c;键盘文件 cat默认从键盘中读取数据再打印 退出可以ctrlc 输入重定向<…...

Codeforces Round 855 (Div 3)(A - F)

Codeforces Round 855 (Div. 3)&#xff08;A - F&#xff09; Codeforces Round 855 (Div. 3) A. Is It a Cat?(思维) 思路&#xff1a;先把所有字母变成小写方便判断 &#xff0c; 然后把每一部分取一个字母出来 &#xff0c; 判断和‘meow’是否相同即可。 复杂度 O ( n…...

Friend.tech(FT):社交媒体金融的未来,真的如此美好吗?

Friend.tech&#xff08;FT&#xff09;是一个在2023年8月10日正式推出的社交金融平台&#xff0c;它的特点在于允许用户购买和出售创作者的股票&#xff08;shares&#xff09;&#xff0c;这些股票赋予用户访问创作者内容的权利。FT的推出引发了广泛的关注&#xff0c;吸引了…...

yolov7中Concat之后加注意力模块(最复杂的情况)

1、common.py中找到Concat模块&#xff0c;复制一份 2、要传参进来&#xff0c;dim通道数 3、然后找yolo.py模块&#xff0c;添加 4、yaml里替换 5、和加的位置也有关系...

解除百度安全验证

使用chrome浏览器用百度浏览时&#xff0c;一直弹百度安全验证&#xff1a; 在设置里进行重置&#xff1a; 然后重启浏览器就可以了。...

Codeforces Round 731 (Div 3)(A - F)

Codeforces Round 731 (Div. 3)(A - F) Dashboard - Codeforces Round 731 (Div. 3) - Codeforces A. Shortest Path with Obstacle&#xff08;思维&#xff09; 思路&#xff1a;显然要计算 A → B 之间的曼哈顿距离 &#xff0c; 要绕开 F 当且仅当 AB形成的直线平行于坐…...

Python的sort()与sorted()函数详解

目录 sort&#xff08;&#xff09;函数 sorted&#xff08;&#xff09;函数 key参数 区别 sort&#xff08;&#xff09;函数 sort()方法&#xff1a;该方法用于原地对列表进行排序&#xff0c;即直接在原始列表上进行排序操作&#xff0c;并不返回一个新的列表。 my_l…...

用python实现基本数据结构【04/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…...

“必抓!”算法

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 你可以从以下几个方面进行创作&#xff08;仅供参考&#xff09; 一&#xff…...

【监控系统】Promethus整合Alertmanager监控告警邮件通知

【监控系统】Promethus整合Alertmanager监控告警邮件通知 Alertmanager是一种开源软件&#xff0c;用于管理和报警监视警报。它与Prometheus紧密集成&#xff0c;后者是一种流行的开源监视和警报系统。Alertmanager从多个源接收警报和通知&#xff0c;并根据一组配置规则来决定…...

【韩顺平】Linux基础

目录 1.网络连接三种方式 1.1 桥接模式&#xff1a;虚拟系统可以和外部系统通讯&#xff0c;但是容易造成IP冲突【1-225】 1.2 NAT模式&#xff1a;网络地址转换模式。虚拟系统可以和外部系统通讯&#xff0c;不造成IP冲突。 1.3 主机模式&#xff1a;独立的系统。 2.虚拟机…...

6大终极方案!WarcraftHelper全方位解决魔兽争霸III在Win10/11兼容性难题

6大终极方案&#xff01;WarcraftHelper全方位解决魔兽争霸III在Win10/11兼容性难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 经典游戏魔兽争霸…...

Cartographer实战:如何用Velodyne 32E激光雷达跑通GraphSLAM(附避坑指南)

Cartographer实战&#xff1a;Velodyne 32E激光雷达的GraphSLAM全流程解析与性能调优 当Velodyne 32E激光雷达遇上Cartographer的GraphSLAM算法&#xff0c;如何在复杂环境中实现厘米级建图精度&#xff1f;本文将拆解从硬件配置到算法调优的完整落地流程&#xff0c;分享我在大…...

SSHFS-Win许可证完全指南:GPLv2+、GPLv3与FLOSS异常条款解析

SSHFS-Win许可证完全指南&#xff1a;GPLv2、GPLv3与FLOSS异常条款解析 【免费下载链接】sshfs-win SSHFS For Windows 项目地址: https://gitcode.com/gh_mirrors/ss/sshfs-win SSHFS-Win是一个让Windows用户通过SSH协议挂载远程服务器目录的开源工具&#xff0c;其许可…...

ViGEmBus虚拟手柄驱动:Windows内核级游戏控制器模拟核心技术解析与应用指南

ViGEmBus虚拟手柄驱动&#xff1a;Windows内核级游戏控制器模拟核心技术解析与应用指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus作为Windows…...

职场“对错陷阱“:为什么你越是讲理,领导越不待见你?

导语&#xff1a;小时候老师教我们"明辨是非"&#xff0c;长大后却发现——在职场里太较真的人&#xff0c;往往混得最差。一、拍桌子的代价2023年春天&#xff0c;我亲眼看见林哥在会议室拍了桌子。"这需求根本不合理&#xff01;数据库设计违反第三范式&#…...

百度网盘提取码智能获取工具:让资源下载效率提升100倍的秘密武器

百度网盘提取码智能获取工具&#xff1a;让资源下载效率提升100倍的秘密武器 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为获取百度网盘分享链接的提取码而浪费宝贵时间吗&#xff1f;面对"请输入提取码"的…...

自然滚动的终结:Scroll Reverser如何重构输入设备交互逻辑

自然滚动的终结&#xff1a;Scroll Reverser如何重构输入设备交互逻辑 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 在追求无缝人机交互的今天&#xff0c;macOS系统中输入设备…...

【Nano Bana】谷歌风格智能手表UI界面

谷歌风格智能手表UI提示词&#xff08;专业工程版设计/开发专用&#xff09; 在嵌入式智能手表UI设计与开发过程中&#xff0c;符合行业规范且适配开发需求的提示词&#xff0c;是高效生成可用界面、对接GUI框架的关键。本文汇总了适配Nano Banana工具的谷歌风格智能手表UI提示…...

JEECG Boot项目实战:如何优雅地移除登录验证码(前后端完整操作指南)

JEECG Boot项目实战&#xff1a;如何优雅地移除登录验证码&#xff08;前后端完整操作指南&#xff09; 在JEECG Boot的开发过程中&#xff0c;验证码功能虽然能有效防止恶意登录&#xff0c;但在某些特定场景下反而会成为效率瓶颈。想象一下这样的场景&#xff1a;开发团队正在…...

显卡接口大乱斗:VGA、DVI、HDMI、DP到底怎么选?附2023年显示器搭配指南

显卡接口终极指南&#xff1a;VGA、DVI、HDMI、DP的2023年实战选择策略 当你面对显示器背面那一排形状各异的接口时&#xff0c;是否曾感到无从下手&#xff1f;VGA的蓝色老将、DVI的白色宽口、HDMI的扁平设计、DP的直角造型——这些看似简单的接口背后&#xff0c;藏着影响画面…...