使用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