最近在研究安卓脫殼技術(shù),從github上找到各種工具測(cè)試結(jié)果届巩。其中一個(gè)工具是DrizzleDumper。大神的代碼從GitHub上clone下來(lái)可以直接編譯運(yùn)行(因?yàn)榇嬖?code>makefile文件页衙,稍微修改后可以直接用make
命令編譯出想要平臺(tái)的代碼疟位,當(dāng)然前提是提前配置好ndk環(huán)境變量),對(duì)于部分殼也有效果版扩。抱著學(xué)習(xí)的態(tài)度废离,我打算仔細(xì)閱讀并嘗試修改源碼,以便讓自己對(duì)脫殼的過程有更加深入的了解礁芦。
為了方便修改過程蜻韭,我打算使用Clion。新建C語(yǔ)言項(xiàng)目柿扣,將drizzleDumper.c
與drizzleDumper.h
文件導(dǎo)入項(xiàng)目復(fù)制到項(xiàng)目中并在CMakeLists.txt
中添加源文件之后肖方,我們遇到了幾個(gè)問題:
1.Clion默認(rèn)引入了Mac系統(tǒng)自帶的頭文件,而不是Ndk
中提供的文件未状,導(dǎo)致一部分定義報(bào)紅俯画。
2.原項(xiàng)目中的makefile默認(rèn)調(diào)用ndk-build
工具編譯,而Clion使用的是cmake
司草,這使得我們無(wú)法使用Clion完成編譯過程艰垂。
網(wǎng)上關(guān)于這些問題有比較詳細(xì)的解決方案,具體可以參照這篇文章:Clion配置Android NDK通過CMake進(jìn)行編譯埋虹。概括而言就是在Clion中配置一下猜憎,使得IDE能夠識(shí)別ndk的頭文件,并且能為目標(biāo)機(jī)器編譯代碼搔课。
下面是整個(gè)過程中配置cmake option
這一步要注意的地方:
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
-DCMAKE_ANDROID_NDK=/Users/flower/Documents/DevEnv/android-ndk-r12b
-DCMAKE_SYSTEM_VERSION=19
-DCMAKE_C_FLAGS=""
-DCMAKE_CXX_FLAGS=""
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang
1.第二行表示目標(biāo)系統(tǒng)架構(gòu)胰柑,由于我是為真機(jī)編譯,因此為armeabi-v7a
爬泥,如果要為x86架構(gòu)的模擬器編譯程序旦事,應(yīng)當(dāng)改為x86
。
2.第三行表示當(dāng)前開發(fā)環(huán)境中Ndk路徑急灭。開始我按照參考文章姐浮,用的是Android Studio
默認(rèn)下載的Ndk,結(jié)果應(yīng)用配置后一直報(bào)錯(cuò)葬馋。經(jīng)查找資料在官網(wǎng)找到了說明卖鲤,大概意思是因?yàn)槲覀冇昧朔荊oogle官方定制的cmake
,有時(shí)候ndk版本偏高了會(huì)有問題畴嘶。這里我換成了之前下載過的一個(gè)低版本的ndk路徑蛋逾,完美解決了問題。
當(dāng)配置完成后窗悯,我們之前遇到的報(bào)紅應(yīng)當(dāng)已經(jīng)消失区匣,可以正常使用Clion編寫安卓平臺(tái)的Native代碼了。
但是后續(xù)編譯程序還有個(gè)問題蒋院,在adb shell
運(yùn)行編譯好的程序會(huì)報(bào)一個(gè)如下的錯(cuò)誤:
error: only position independent executables (PIE) are supported.
估計(jì)還是配置的問題亏钩,網(wǎng)上說是在安卓4.4之后添加了新的保護(hù)機(jī)制,可執(zhí)行文件必須是采用PIE編譯的莲绰。我在原項(xiàng)目中的Android.mk
中看到了這部分內(nèi)容:
# Allow execution on android-16+
LOCAL_CFLAGS += -fPIE
LOCAL_LDFLAGS += -fPIE -pie
但是在cmake
中應(yīng)當(dāng)如何配置呢?經(jīng)過查找資料姑丑,發(fā)現(xiàn)這篇文章:cmake使用獨(dú)立工具鏈交叉編譯可在android中運(yùn)行的so包
蛤签。我在其中找到了要在CMakeList.txt
文件中添加的關(guān)鍵兩行:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
之后應(yīng)用一下更改,再編譯項(xiàng)目栅哀,就可以完美運(yùn)行啦震肮。
過程中的參考鏈接如下:
Clion配置Android NDK通過CMake進(jìn)行編譯
解決 CLion 報(bào)紅 NDK 相關(guān)頭文件
cmake使用獨(dú)立工具鏈交叉編譯可在android中運(yùn)行的so包
Android Gradle Plugin 源碼解析之 externalNativeBuild
cmake 交叉編譯
CMake + NDK + CLion針對(duì)CLion開發(fā)工具的配置
可能的另一種配置方案?
Stackoverflow:Integrate CLion and Android NDK
https://cmake.org/cmake/help/v3.7/manual/cmake-toolchains.7.html#cross-compiling-for-android-with-the-ndk