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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值