资讯专栏INFORMATION COLUMN

编译可在Android上运行的qemu user mode

LMou / 3412人阅读

摘要:意味着编译出的程序只能在机器上执行。当命令行中有选项时,脚本中的禁用宏将被设置为,这个宏默认为。当宏为时,会对宏进行设置,下面是与有关的设置宏的代码脚本会将宏的内容写入文件。

前言

本文在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 ”更改为”#include ”。

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”命令选项。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12967.html

相关文章

  • Android使用qemu-user运行可执行文件

    摘要:作者寻禹阿里聚安全前言简要介绍可以解释执行可执行程序。编译出来的结果分为系统模式和用户模式,用户模式编译出来的可执行文件名为。所以覆盖完成后需要执行命令设置的用户组。 作者:寻禹@阿里聚安全 前言 QEMU简要介绍:QEMU可以解释执行可执行程序。既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行了哪些指令,从而可以跟踪指令的执行。QEMU编译出来的结果分为系统模式和用户模...

    nanfeiyan 评论0 收藏0
  • AOSP 源码整编单编

    摘要:源码下载完成后,就可以开编了。其中代表开源项目表示系统是运行在架构的处理器上,则是指位架构处理器,则表示架构的处理器,更多设备代码和编译目标参考官方文档。不出意外,当看到就整编成功了。 《AOSP 源码下载》完成后,就可以开编了。 整编 整编,顾名思义就是编译整个 Android 源码,最终 out 目录会生成几个重要的镜像文件,其中有 system.img、userdata.img、...

    chadLi 评论0 收藏0
  • linux搭建react-native+android-studio开发环境踩坑

    摘要:今天在下搭建,遇到一些问题,终于折腾成功,特此记录。提示具体包名可在搜索关键字查询。相关用以对模拟器加速根据发行版安装具体包名可在搜索关键字查询,或使用包管理器搜索关键字,启用相关模组一般会自动启用。使用即可启动名为的虚拟机。 今天在archlinux下搭建react native + android,遇到一些问题,终于折腾成功,特此记录。 参照react native文档的步骤进行...

    Batkid 评论0 收藏0
  • 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路

    摘要:阿里聚安全攻防挑战赛第三题解题思路大家在聚安全挑战赛正式赛第三题中,遇到远程控制的题目。反汇编文件发现中果然有接受相关的内容。也就是说攻击者的网页至少如下反汇编类发现,它会把指向的文件当作特定格式的解析。 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路 大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目。我们今天带你一探究竟,如何攻破这道题目。 ...

    Aldous 评论0 收藏0
  • 写一个引导程序(boot loader)(翻译)

    摘要:的我们将编写一个软盘引导加载程序,它不需要我们处理文件系统,这有助于使事情尽可能简单。如果最后两个字节等于,那么将跳转到位置,有效地将控制转移到引导加载程序。此时以位模式运行,这意味着只有位寄存器可用。 环境 首先,你需要安装NASM汇编器和QEMU来模拟一个虚拟机。用QEMU很好,因为我们不用担心有时候不小心写了烂的OS代码而把硬件给搞坏了;) 。在win 10的wsl或Ubuntu...

    tangr206 评论0 收藏0

发表评论

0条评论

LMou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<