使用NDK make編譯so文件
目錄
1.安裝環境
首先我們要去ndk的官網去下載一個ndk,這裏筆者建議下載一個老一些的版本10~13左右,因爲在比較新的一些ndk都是在make的時候會遇到各種各樣的問題。
- 首先打開ndk的官網
選擇不受支持的舊版本。 - 選擇需要的版本,筆者認爲選擇12 3左右應該可以
- 下載完成後將其解壓到C:盤或者是其他盤,筆者在這裏放在D:盤。
- 將ndk的編譯路徑D:\android-ndk-rXX\prebuilt\windows-x86_64\bin;E:\AndroidCrack\platform-tools;
放到系統變量環境的PATH裏面
記得要在最後添加 ;
英文的。 - 打開CMD 輸入make 若出現下面這樣則配置成功
到這裏配置就算完成了,接下來就是編譯了。
2.編譯
- Makefile的編寫
- 執行
筆者在這裏用的是非蟲大佬在《Android軟件安全與逆向分析》提供的Makefile文件修改而來,到目前爲止還能用。筆者在PC端的安卓模擬器測試還能用。
Makefile代碼如下:
NDK_ROOT=D:\android-ndk-r17c #ndk 安裝解壓的目錄
TOOLCHAINS_ROOT=$(NDK_ROOT)\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)\bin\arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)\lib\gcc\arm-linux-androideabi\4.9.x\include-fixed
PLATFORM_ROOT=$(NDK_ROOT)\platforms\android-14\arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)\usr\include
PLATFORM_LIB=$(PLATFORM_ROOT)\usr\lib
MODULE_NAME=user
BUILD_TYPE=c
PATH_ANDROID=/data/local/tmp/
RM=del
FLAGS=-I$(TOOLCHAINS_INCLUDE) \
-I$(PLATFORM_INCLUDE) \
-L$(PLATFORM_LIB) \
-nostdlib \
-lgcc \
-Bdynamic \
-lc \
-pie -fPIE \
OBJS=$(MODULE_NAME).o \
$(PLATFORM_LIB)/crtbegin_dynamic.o \
$(PLATFORM_LIB)/crtend_android.o
all:
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -E $(MODALE_NAME).c -o $(MODALE_NAME).i #產生 .i文件
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o #產生 .o文件
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -S $(MODULE_NAME).c -o $(MODULE_NAME).s #產生 .s彙編文件
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
clean:
$(RM) *.o
install:
adb push $(MODULE_NAME) /data/local/tmp
adb shell chmod 755 /data/local/tmp/$(MODULE_NAME)
adb shell /data/local/tmp/$(MODULE_NAME)
run:
adb shell /data/local/tmp/$(MODULE_NAME)
例子:
#include<stdio.h>
int main(){
printf("hello arm");
return 0;
}
保存放到同一個文件夾
然後在地址 然輸入CMD 回車
輸入make
到這裏的話編譯已經完成我們打開文件夾
接着打開模擬器運行輸入
make install
當你要再次運行時只需要輸入
make run
3.遇到的一些問題及解決
- 找不到stdio.h文件
- only position independent executables (PIE) are supported
解決方法:
- 找不到stdio.h文件
這個問題只會出現在一些較高版本的ndk裏面,筆者用的是r17c也遇到了同樣的問題,筆者在這裏的解決方法是將r10e裏的 android-ndk-r10e\platforms\android-14\arch-arm\usr 裏的 include文件 複製到 ==D:\android-ndk-r17c\platforms\android-14\arch-arm\usr == 裏面至此完美解決。
2.only position independent executables (PIE) are supported
只需要在Makefile裏的裏添加 == -pie -fPIE \ ==
FLAGS=-IKaTeX parse error: Undefined control sequence: \ at position 22: …HAINS_INCLUDE) \̲ ̲ -I(PLATFORM_INCLUDE)
-L$(PLATFORM_LIB)
-nostdlib
-lgcc
-Bdynamic
-lc
-pie -fPIE \
參考文檔:
1.豐強生 《Android軟件安全與逆向分析》
2.only position independent executables (PIE) are supported的解決問題. https://blog.csdn.net/hxdanya/article/details/39371759
3ndk生成ARM彙編(附代碼). https://blog.csdn.net/earbao/article/details/53933023