星空网 > 软件开发 > 操作系统

编译可在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的软链接


编译可在Android上运行的qemu user modeimages/loading.gif' data-original="http://epo.alicdn.com/image/d1ge6tccro8.JPG" width="800" data-ke-src='/images/loading.gif' data-original="http://www.cnblogs.com///epo.alicdn.com/image/d1ge6tccro8.JPG" />

ln命令中的源路径是pkg-config工具的源路径。

如果不创建这个软链接,当执行configure脚本时会报下面的错误:

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

 

6. 修改configure


添加arm的PIE支持

找到下面的代码:


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

将”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中有这么一段代码:

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

如果编译可在Android上运行的qemu user modetextseg_addr”这个命令行选项,这个命令行选项指定text段的基址。在脚本的后面textseg_ldflags会被添加到ldflags中。

如果qemu-arm可加载段的基址为0x60000000,当qemu-arm在Android设备上运行时将会发生”Segmentation fault”,详情请参考Android上可执行ELF文件中的段不能有基址。

 

7. 运行configure


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

 

命令行解析

configure脚本会在终端输出一些关键的信息,如:用什么编译器,flags等。

 

PKG_CONFIG_PATH

上面命令中的PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig"是必要的,如果不设置这个宏,configure脚本输出”CFLAGS”的内容见下:

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

 

关注”-I”后的路径,首先说一下这个路径是怎么来的,configure脚本中有下面的代码:

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

 

“glib_cflags=$pkg_config --cflags $i“语句会获得glib的包含目录,看这篇文章的人如果电脑上安装有glib2.0可以通过这个命令进行查看输出内容:pkg-config –cflags glib-2.0。然而这个路径并不是我想要的,因为我现在是交叉编译,目标是ARM,所以我在这里将一个新的pkgconfig目录路径设置到PKG_CONFIG_PATH宏,输入下面的命令查看输出内容:

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

 

输出内容:

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

 

会发现此时”-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宏的代码:

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

configure脚本会将tools宏的内容写入config-host.mak文件。

 

–disable-guest-agent

当没有这个选项时,编译会报下面的错误:

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

为PC编译qemu项目没有这个命令选项时不会报这个错误,然而lockf函数在Android上并不存在,所以为Android编译qemu项目时会报这个错误。

 

编译错误排除


ld: error: cannot find -lutil

将根目录下的Makefile文件中下面的内容注释:


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

 

ifaddrs.h: No such file or directory

错误信息


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

修复办法:将这个链接中的源文件都下载下来:android-ifaddrs,将下载下来的文件拷贝到qga/目录下。然后找到qga/Makefile.objs文件,将”ifaddrs.o”插入”qga-obj-$(CONFIG_POSIX)”宏中。

 

mqueue.h: No such file or directory

错误信息


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

修复办法:将”#include <mqueue.h>”更改为”#include <linux/mqueue.h>”。

 

char __unused[128 - sizeof(target_sigset_t)];

错误信息


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

修复办法:将__unused更改为_unused。

 

syscall.c:4108:9: error: dereferencing pointer to incomplete type

错误信息


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

修复办法


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

改为


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

 

disas/arm-a64.cc:67: error: undefined reference to ‘__cxa_end_cleanup’

错误信息


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

解决办法 :在configure中找到下面的代码:


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

将这些代码注释掉:


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

原因分析 :目前在Android NDK中没有64位版本的object。

 

syscall.c中找不到符号

错误信息


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

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

 解决办法:在syscall.c文件中写下面的内容

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

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

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

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

 

编译清理命令

执行下面两个命令:


make clean

make distclean

 

编译debug版

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

 

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




原标题:编译可在Android上运行的qemu user mode

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

跨境电商中期运营,如何低成本留住用户?:https://www.ikjzd.com/articles/111159
速卖通双11捷报 手机通讯类成出海畅销品!:https://www.ikjzd.com/articles/111161
爆款产品,为何突然卖不动了?:https://www.ikjzd.com/articles/111162
外管局发文!再次明确小微跨境电商20万美元的认定标准!:https://www.ikjzd.com/articles/111163
你了解shopee电商平台吗?做shopee有什么优势?:https://www.ikjzd.com/articles/111164
双倍的快乐!亚马逊后台A+页面更新玩法:https://www.ikjzd.com/articles/111165
武陵山大裂谷周围景点 武陵山大裂谷周围景点图片:https://www.vstour.cn/a/411233.html
南美旅游报价(探索南美洲的旅行费用):https://www.vstour.cn/a/411234.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流