使用NDK make編譯so文件

目錄

1.安裝環境

首先我們要去ndk的官網去下載一個ndk,這裏筆者建議下載一個老一些的版本10~13左右,因爲在比較新的一些ndk都是在make的時候會遇到各種各樣的問題。

  1. 首先打開ndk的官網
    選擇不受支持的舊版本。
  2. 選擇需要的版本,筆者認爲選擇12 3左右應該可以 下載圖片
  3. 下載完成後將其解壓到C:盤或者是其他盤,筆者在這裏放在D:盤。
  4. 將ndk的編譯路徑D:\android-ndk-rXX\prebuilt\windows-x86_64\bin;E:\AndroidCrack\platform-tools;
    放到系統變量環境的PATH裏面
    路徑 記得要在最後添加 ;
    英文的。
  5. 打開CMD 輸入make 若出現下面這樣則配置成功 make

到這裏配置就算完成了,接下來就是編譯了。

2.編譯

  1. Makefile的編寫
  2. 執行

筆者在這裏用的是非蟲大佬在《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 回車
打開CMD
輸入make
編譯完成
到這裏的話編譯已經完成我們打開文件夾
產生結果
接着打開模擬器運行輸入

make install

運行結果
當你要再次運行時只需要輸入

make run

run

3.遇到的一些問題及解決

  1. 找不到stdio.h文件
  2. only position independent executables (PIE) are supported

解決方法:

  1. 找不到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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章