android Android NDK开发2之Windows及L下的gcc手动编译(交叉连编译
转载自 //https://www.52pojie.cn/thread-549754-1-1.html
作者 //牵走天涯
时间 2020 11 23 0:17
{
一、交叉工具链
这些工具都在NDK的路径下:E:\Android\android-ndk-r13\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin
这些工具的前缀均为arm-linux-androideabi,可以直接使用他们来编写NDK原生程序
Windows和Linux平台使用的gcc都是一样的,命令参数也是一样的:
arm-linux-androideabi-addr2line //将程序地址转换为文件名和行号
arm-linux-androideabi-ar // 建立、修改、提取归档文件
arm-linux-androideabi-as //gas汇编器
arm-linux-androideabi-c++ //工具链中arm-linux-androideabi-g++.exe的一个拷贝
arm-linux-androideabi-c++filt //连接器使用它过滤符号,防止重载函数冲突
arm-linux-androideabi-cpp //C++程序编译工具
arm-linux-androideabi-g++ //C++程序编译工具
arm-linux-androideabi-gcc-4.9.x //工具链中arm-linux-androideabi-gcc.exe的一个拷贝
arm-linux-androideabi-gcc //C程序编译工具
arm-linux-androideabi-gcov //程序覆盖度测量工具,记录代码的执行路径
arm-linux-androideabi-gdb //调试工具
arm-linux-androideabi-gprof //程序性能测量工具
arm-linux-androideabi-ld //连接器,用于生成可执行程序
arm-linux-androideabi-nm //列出目标文件中的符号
arm-linux-androideabi-objcopy //复制目标文件中的内容到另一种类型的目标文件中
arm-linux-androideabi-objdump //输出目标文件的信息
arm-linux-androideabi-ranlib //产生归档文件索引,并将其保存到这个归档文件中
arm-linux-androideabi-readelf //显示elf格式可执行文件的信息
arm-linux-androideabi-run //ARM程序模拟器
arm-linux-androideabi-size //列出目标文件每一段的大小及总体的大小
arm-linux-androideabi-strings //输出目标文件的可打印字符串
arm-linux-androideabi-strip //去除目标文件中的符号信息
以上摘录之《Android软件安全与逆向分析》
二、编写C++程序
我这里习惯使用VS2012,大家可以按自己的习惯。记事本都可以。
[C] 纯文本查看 复制代码
1
2
3
4
|
#include <stdio.h> void main(){ printf ( "Hello,you are successful !" ); } |
三、编写makefile
注意:1.斜杠的方向(千万不要弄反了,这个很重要!!!)
2.把我makefile中 的//以及后面的内容删除!
3.一定记得先配置环境
最后给这个makefile文档
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
NDK_ROOT=E:/Android/android-ndk-r13 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-17/arch-arm PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/ include PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib MODULE_NAME=HelloNDK RM=del FLAGS=-I$(TOOLCHAINS_INCLUDE) \ -I$(PLATFORM_INCLUDE) \ -L$(PLATFORM_LIB) \ -nostdlib \ -lgcc \ -Bdynamic \ -lc OBJS=$(MODULE_NAME).o \ $(PLATFORM_LIB)/crtbegin_dynamic.o \ $(PLATFORM_LIB)/crtend_android.o all : $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) - c $(MODULE_NAME). c -o $(MODULE_NAME).o $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME) clean: $(RM) *.o install: adb push $(MODULE_NAME) /data/ local / adb shell chmod 755 /data/ local /$(MODULE_NAME) |
四、编译
我们把这些东西弄好了放到桌面上的文件夹gccNDKtest。
然后cmd命令打开这个文件夹
然后make
看到是这个样子,就说明没有问题了
接下来,我们需要看效果,就需要一个Android的手机或者模拟器了。
依次输入
make install
adb shell /data/local/HelloNDK
就可以看到效果图了
五、Linux
和Windows差不多,重点是环境需要配置好
我直接把Windows里面的C放进去,再编写makefile
makefile如下
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
NDK_ROOT=/home/tools/android-ndk-r13 TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-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-17/arch-arm PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/ include PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib MODULE_NAME=HelloNDK RM=rm -rf FLAGS=-I$(TOOLCHAINS_INCLUDE) \ -I$(PLATFORM_INCLUDE) \ -L$(PLATFORM_LIB) \ -nostdlib \ -lgcc \ -Bdynamic \ -lc OBJS=$(MODULE_NAME).o \ $(PLATFORM_LIB)/crtbegin_dynamic.o \ $(PLATFORM_LIB)/crtend_android.o all : $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) - c $(MODULE_NAME). c -o $(MODULE_NAME).o $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME) clean: $(RM) *.o install: adb push $(MODULE_NAME) /data/ local / adb shell chmod 755 /data/ local /$(MODULE_NAME) |
然后放到Linux下面去,到这个文件的目录下make就OK的。
命令是
sorgs@sorgs-VirtualBox:/home/tools/gccNDKtest$ sudo make
这个就说明编译成功了。
因为我这Linux是虚拟机,所以不好用手机真是去测试
所以手续的测试就在Windows上测试的,效果和上面的一样。
六、总结
虽然看起来这很简单,但是实际上自己不去动手,永远不知道这点点东西来的多么艰辛,各种百度查。
其实这个还遗留了一个问题。本来说好的NDK用gcc编译,是可以编译C++的,但是我写了一个C++。不管怎么修改makefile都要报错。这个问题我查了很多资料,都没有结果。我在想等下,有空了,去问问我们的老师,看看能不能给出答案。如果可以的话,再回来更新,编写一个C++的代码尝试编译。
然后就是Linux,我的天啊。我之前都没有学过这个,然后为了写出来来尝试,才开始研究。各种报错,各种重装。
你不去动手,永远不知道这里面的辛酸和晚上连续几天熬夜到12点的汗水以及成功之后的喜悦。
所以说,不要看着简单,要实际去做做!
链接:http://pan.baidu.com/s/1boNj4IF 密码:w4ec
-
Android逆向基础笔记—Android NDK开发2之Windows下的gcc手动编译(交叉连编译)和利L.doc
264.56 KB, 下载次数: 27, 下载积分: 吾爱币 -1 CB
文档
}