編輯:關於android開發
本文在Ubuntu 64位系統上對qemu項目進行交叉編譯,並且只編譯與qemu user mode有關的代碼。
下文中的”NDK”若無特殊說明均指”Android NDK”。
下文中”$NDK”表示的是NDK的根目錄。
下載並安裝Android NDK的過程在這裡不做介紹。
為交叉編譯設置Android NDK環境變量:NDK、SYSROOT
glib
編譯可在Android上運行的glib庫
編譯參考資料:編譯可在Android上運行的glib庫
libpng12
下載地址:https://sourceforge.net/projects/libpng/files/libpng12/
編譯參考資料:編譯可在Android上運行的libffi庫
ln命令中的源路徑是pkg-config工具的源路徑。
如果不創建這個軟鏈接,當執行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文件中的段不能有基址。
命令行解析
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項目時會報這個錯誤。
將根目錄下的Makefile文件中下面的內容注釋:
錯誤信息
修復辦法:將這個鏈接中的源文件都下載下來:android-ifaddrs,將下載下來的文件拷貝到qga/目錄下。然後找到qga/Makefile.objs文件,將”ifaddrs.o”插入”qga-obj-$(CONFIG_POSIX)”宏中。
錯誤信息
修復辦法:將”#include <mqueue.h>”更改為”#include <linux/mqueue.h>”。
錯誤信息
修復辦法:將__unused更改為_unused。
錯誤信息
修復辦法
改為
錯誤信息
解決辦法 :在configure中找到下面的代碼:
將這些代碼注釋掉:
原因分析 :目前在Android NDK中沒有64位版本的object。
錯誤信息
解決辦法:在syscall.c文件中寫下面的內容
執行下面兩個命令:
make cleanmake distclean
調用configure腳本的命令行中添加”–enable-debug”命令選項。
作者:尋禹@阿裡聚安全,更多技術文章,請訪問阿裡聚安全博客
Android快樂貪吃蛇游戲實戰項目開發教程-01項目概述,android-01一、項目簡介 貪吃蛇是一個很經典的游戲,也很適合用來學習。本教程將和大家一起做一個Andr
Linux內核系列—5.操作系統開發之特權級及特權級的轉移,linux特權CPL——當前執行的程序或任務的特權級,它被存儲在cs和ss的第0位和第
Android反射機制實現與原理,android反射機制本文介紹Android反射機制實現與原理,在介紹之前,要和Java進行比較,所以先看下Java中的反射相關知識:
項目需求:自定義倒計時的TextView,倒計時textview現在這麼一個需求: 我有一個ListView,每一個列表項 布局如上圖,頂部一個大圖片展示,中部一個音頻