编译可在Android上运行的qemu user mode
前言
本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码。
下文中的”NDK”若无特殊说明均指”Android NDK”。
下文中”$NDK”表示的是NDK的根目录。
步骤
1. 下载并安装Android NDK
下载并安装Android NDK的过程在这里不做介绍。
2. 下载qemu
3. 设置NDK工具的环境变量
为交叉编译设置Android NDK环境变量:NDK、SYSROOT
4. 编译依赖库
glib
编译可在Android上运行的glib库
编译参考资料:编译可在Android上运行的glib库
libpng12
下载地址:https://sourceforge.net/projects/libpng/files/libpng12/
编译参考资料:编译可在Android上运行的libffi库
5. 创建pkg-config的软链接
ln命令中的源路径是pkg-config工具的源路径。
如果不创建这个软链接,当执行configure脚本时会报下面的错误:
6. 修改configure
添加arm的PIE支持
找到下面的代码:
将”i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD”更改为”i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD|arm-Linux”。
如果不这么做的后果,使用”readelf -S qemu-arm”查看编译出来的qemu-arm可执行文件的段,可以发现所有在运行时可加载段的地址均以0x60000000为基址。
在configure中有这么一段代码:
如果textseg_addr”这个命令行选项,这个命令行选项指定text段的基址。在脚本的后面textseg_ldflags会被添加到ldflags中。
如果qemu-arm可加载段的基址为0x60000000,当qemu-arm在Android设备上运行时将会发生”Segmentation fault”,详情请参考Android上可执行ELF文件中的段不能有基址。
7. 运行configure
命令行解析
configure脚本会在终端输出一些关键的信息,如:用什么编译器,flags等。
PKG_CONFIG_PATH
上面命令中的PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig"是必要的,如果不设置这个宏,configure脚本输出”CFLAGS”的内容见下:
关注”-I”后的路径,首先说一下这个路径是怎么来的,configure脚本中有下面的代码:
“glib_cflags=$pkg_config --cflags $i“语句会获得glib的包含目录,看这篇文章的人如果电脑上安装有glib2.0可以通过这个命令进行查看输出内容:pkg-config –cflags glib-2.0。然而这个路径并不是我想要的,因为我现在是交叉编译,目标是ARM,所以我在这里将一个新的pkgconfig目录路径设置到PKG_CONFIG_PATH宏,输入下面的命令查看输出内容:
输出内容:
会发现此时”-I”后的路径有了改变。
注意:pkgconfig是一个目录,在这个目录中包含了步骤5中安装的依赖库的信息。
–target-list –cpu
–target-list arm-linux-user 意味着编译出来的qemu程序用于user mode,可以执行arm指令,并且这个arm指令的可执行程序的执行环境基于linux系统。
–cpu=arm 意味着编译出的qemu程序只能在arm机器上执行。
–disable-system –disable-bsd-user
–disable-system:不编译system mode的代码。
–disable-bsd-user:不编译bsd user mode的代码。
–cross-prefix
交叉编译工具的前缀,在当前命令行中它的值为”arm-linux-androideabi-“,那么configure脚本会去查找名为arm-linux-androideabi-gcc、arm-linux-androideabi-g++等工具。
–disable-tools
当命令行中有–disable-tools选项时,脚本中的禁用want_tools宏将被设置为”no”,这个宏默认为”yes”。当want_tools宏为”yes”时,会对tools宏进行设置,下面是与want_tools有关的设置tools宏的代码:
configure脚本会将tools宏的内容写入config-host.mak文件。
–disable-guest-agent
当没有这个选项时,编译会报下面的错误:
为PC编译qemu项目没有这个命令选项时不会报这个错误,然而lockf函数在Android上并不存在,所以为Android编译qemu项目时会报这个错误。
编译错误排除
ld: error: cannot find -lutil
将根目录下的Makefile文件中下面的内容注释:
ifaddrs.h: No such file or directory
错误信息
修复办法:将这个链接中的源文件都下载下来:android-ifaddrs,将下载下来的文件拷贝到qga/目录下。然后找到qga/Makefile.objs文件,将”ifaddrs.o”插入”qga-obj-$(CONFIG_POSIX)”宏中。
mqueue.h: No such file or directory
错误信息
修复办法:将”#include <mqueue.h>”更改为”#include <linux/mqueue.h>”。
char __unused[128 - sizeof(target_sigset_t)];
错误信息
修复办法:将__unused更改为_unused。
syscall.c:4108:9: error: dereferencing pointer to incomplete type
错误信息
修复办法
改为
disas/arm-a64.cc:67: error: undefined reference to ‘__cxa_end_cleanup’
错误信息
解决办法 :在configure中找到下面的代码:
将这些代码注释掉:
原因分析 :目前在Android NDK中没有64位版本的object。
syscall.c中找不到符号
错误信息
解决办法:在syscall.c文件中写下面的内容
编译清理命令
执行下面两个命令:
make distclean
编译debug版
调用configure脚本的命令行中添加”–enable-debug”命令选项。
作者:寻禹@阿里聚安全,更多技术文章,请访问阿里聚安全博客
编译可在Android上运行的qemu user mode相关推荐
- android通过c调用shmat函数,编译可在Android上运行的qemu user mode
编译可在Android上运行的qemu user mode @(Android研究)[android|qemu] [TOC] 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编 ...
- 编译可在Android上运行的qemu
本文在ubuntu20.04上对qemu进行交叉编译 注意:NDK编译器工具API级别要在30以后,最好用33 因为只有30以后的版本支持函数memfd_create,详情请看http://t.csd ...
- 静态编译parted在Android上运行
[前言] 现在有越来越多的Android手机用上了GPT分区表.我目前接触过的有:华为C8816.G6-C00.Ascend P6,中兴U880E,还有亚马逊Kindle Fire.目前我不太好解释G ...
- ace+arm+linux,用NDK编译ACE在Android上运行
1.准备工具链 ./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-Androideabi-4.4.3 --arch=ar ...
- 编译可在Android上运行的依赖库(二):gettext库
随着代码的不断更新,原来的文章有很多地方已经不适用于现在,所有增加了本文章,对过去NDK交叉编译gettext源码进行更改和补充. 下载gettext源码gettext-0.21.tar.gz: In ...
- 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)
编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的&q ...
- python程序在安卓上如何运行-在 android 上运行 python 的方法
在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...
- 如何用android下载python_如何在android上运行Python代码
展开全部 在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的e69da5e6ba906261696475 ...
- 安卓如何运行python_如何在android上运行Python代码?
这个非常简单,Termux和QPython3这2个安卓APP就可以,都集成了Python解释器,可以直接编辑运行Python代码,下面我简单介绍一下: Termux 这是一个安卓高级终端APP,类似于 ...
最新文章
- Java按钮哪个方法响应_当用户点击按钮时,Java程序采用什么方法来响应?()
- iOS 排序算法总结、二分法查找
- 1.0Nvm环境配置
- enum和enum class
- BugkuCTF-MISC题三色绘恋
- 计算机二级办公软件高级应用难不难,计算机二级office难吗 考试内容是什么
- 一文学会JVM常见参数设置+调优经验(JDK1.8)
- Android将应用调试log信息保存在SD卡
- 如何手动查杀病毒【熊猫烧香】
- GitHub使用教程-官网指南
- 深入浅出学大数据(一)大数据发展历程及大数据的简单介绍
- 一次电子罗盘+GPS智能转舵小车
- python获取国内IP地址合集下发至网络设备
- windows电脑快捷键大全 - 高手总是很酷的
- Java客户端开发与服务端开发
- 解决微信公众账号申请认证方面的问题
- MongoDB启动命令
- 计算机组成原理——微程序控制器
- 读《潜伏在办公室》第二季 (2)
- Python中的 print()输出函数
热门文章
- python3 matlabplot 和numpy 简单绘图
- petalinux 下使用 xsa 查看所有的 Zynq Reg 设置
- ios与html数据交互,iOS iOS与html进行交互
- 【FPGA】SRIO IP核系统总览以及端口介绍(三)(Messaging Port、User-Defined Port介绍)
- FPGA笔试题解析(五):串并转换与奇分频电路
- 【 FPGA 】组合逻辑中的竞争与险象问题(四)
- HAProxy客户端IP地址的透传
- GLOBAL TEMPORARY TABLE
- 福禄克网络与NBASE-T联盟联合发布电缆布线基础设施白皮书
- pyinstaller 工具起步