前言

本文在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 clean

make distclean

 

编译debug版

调用configure脚本的命令行中添加”–enable-debug”命令选项。

作者:寻禹@阿里聚安全,更多技术文章,请访问阿里聚安全博客

编译可在Android上运行的qemu user mode相关推荐

  1. android通过c调用shmat函数,编译可在Android上运行的qemu user mode

    编译可在Android上运行的qemu user mode @(Android研究)[android|qemu] [TOC] 前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编 ...

  2. 编译可在Android上运行的qemu

    本文在ubuntu20.04上对qemu进行交叉编译 注意:NDK编译器工具API级别要在30以后,最好用33 因为只有30以后的版本支持函数memfd_create,详情请看http://t.csd ...

  3. 静态编译parted在Android上运行

    [前言] 现在有越来越多的Android手机用上了GPT分区表.我目前接触过的有:华为C8816.G6-C00.Ascend P6,中兴U880E,还有亚马逊Kindle Fire.目前我不太好解释G ...

  4. ace+arm+linux,用NDK编译ACE在Android上运行

    1.准备工具链 ./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-Androideabi-4.4.3 --arch=ar ...

  5. 编译可在Android上运行的依赖库(二):gettext库

    随着代码的不断更新,原来的文章有很多地方已经不适用于现在,所有增加了本文章,对过去NDK交叉编译gettext源码进行更改和补充. 下载gettext源码gettext-0.21.tar.gz: In ...

  6. 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)

    编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的&q ...

  7. python程序在安卓上如何运行-在 android 上运行 python 的方法

    在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的事情,因为python脚本真是非常高效,另外,有很多非 ...

  8. 如何用android下载python_如何在android上运行Python代码

    展开全部 在android上运行python脚本,或者在android上使用python交互界面,对熟悉python的研究或开发人员来说,是一件很有吸引力的e69da5e6ba906261696475 ...

  9. 安卓如何运行python_如何在android上运行Python代码?

    这个非常简单,Termux和QPython3这2个安卓APP就可以,都集成了Python解释器,可以直接编辑运行Python代码,下面我简单介绍一下: Termux 这是一个安卓高级终端APP,类似于 ...

最新文章

  1. Java按钮哪个方法响应_当用户点击按钮时,Java程序采用什么方法来响应?()
  2. iOS 排序算法总结、二分法查找
  3. 1.0Nvm环境配置
  4. enum和enum class
  5. BugkuCTF-MISC题三色绘恋
  6. 计算机二级办公软件高级应用难不难,计算机二级office难吗 考试内容是什么
  7. 一文学会JVM常见参数设置+调优经验(JDK1.8)
  8. Android将应用调试log信息保存在SD卡
  9. 如何手动查杀病毒【熊猫烧香】
  10. GitHub使用教程-官网指南
  11. 深入浅出学大数据(一)大数据发展历程及大数据的简单介绍
  12. 一次电子罗盘+GPS智能转舵小车
  13. python获取国内IP地址合集下发至网络设备
  14. windows电脑快捷键大全 - 高手总是很酷的
  15. Java客户端开发与服务端开发
  16. 解决微信公众账号申请认证方面的问题
  17. MongoDB启动命令
  18. 计算机组成原理——微程序控制器
  19. 读《潜伏在办公室》第二季 (2)
  20. Python中的 print()输出函数

热门文章

  1. python3 matlabplot 和numpy 简单绘图
  2. petalinux 下使用 xsa 查看所有的 Zynq Reg 设置
  3. ios与html数据交互,iOS iOS与html进行交互
  4. 【FPGA】SRIO IP核系统总览以及端口介绍(三)(Messaging Port、User-Defined Port介绍)
  5. FPGA笔试题解析(五):串并转换与奇分频电路
  6. 【 FPGA 】组合逻辑中的竞争与险象问题(四)
  7. HAProxy客户端IP地址的透传
  8. GLOBAL TEMPORARY TABLE
  9. 福禄克网络与NBASE-T联盟联合发布电缆布线基础设施白皮书
  10. pyinstaller 工具起步