如何编译可执行程序
往期推荐
之前分享了APP程序,即APK文件,它与今天分享的executable程序,即可执行程序之间有着什么样的区别呢?让我们带着这个疑问来学习今天的内容。
一: 编写C代码
新建一个文件夹 ,取名为first,英文为“第一”的意思,代表它是第一个程序,这里大家可以随意取名,但最好使用英文。
接下来使用记事本编写一段C代码,在这里先新建一个“.txt”文件取名为“yijindaxue”,由于在C程序中,源文件的后缀为“.c”,所以将文件后缀改为“.c”,在该文件里面写入一行代码输出“易锦大学”。例如:“printlf (“易锦大学”);”,最后,Ctrl+s保存一下。
完整代码如下所示:
注意:在这里要记住需要导入一个“.h”文件,才能够使用printf输出,“\n”的作用就是让他换行。
C代码编写完成,由于NDK工具需要根据Android.mk和Application.mk两个文件来编译.c文件,因此要先编写好这两个.mk文件。
二:编写Android.mk文件
探究:什么是Android.mk文件?
Android.mk文件是用来描述编译器如何去编译“.c”文件的。
在前面已经新建了一个first文件夹,在该文件夹下再新建一个文件夹取名为“jni”,“jni”这个名称是编译器规定的,不能随意改动。然后在“jni”文件夹下新建一个文件,文件名改为“Android.mk”,文件名同样不可变更。
接着选中“Android.mk”文件,右键用记事本打开,编写里面相关的配置代码。
LOCAL_PATH := $(call my-dir):表示当前Android.mk文件所在路径。
include $(CLEAR_VARS) :清除前面设置的环境。
下面两个属性在编译可执行文件时必须添加,如果在Android5.0及5.0以上,不添加下面的两个属性,可执行程序执行就一定会报错。
LOCAL_CFLAGS+=-pie -fPIE
LOCAL_LDFLAGS+=-pie –fPIE
下面这句是编译后的指令集,后面的arm就是arm指令集,在后面学习arm汇编时再进一步学习。
LOCAL_ARM_MODE := arm
LOCAL_MODULE := yijindaxue 模块名称
LOCAL_SRC_FILES := yijindaxue.c 之前编写的.c代码的文件名称。
最后还需要配置一项属性,也就是include $(BUILD_EXECUTABLE),在这里是指定编译的文件类型。同时介绍3种编译的文件类型:build_executable是可执行文件;build_shared_library是动态链接库;build_static_library是静态链接库。
注意:在配置属性项,指定编译的文件类型时英文一定得要大写。
现在看到的,就是第一个完整的Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS+=-pie –fPIE
LOCAL_LDFLAGS+=-pie -fPIE
LOCAL_ARM_MODE :=arm
LOCAL_MODULE := yijindaxue
LOCAL_SRC_FILES :=yijindaxue.c
include $(BUILD_EXECUTABLE)
在这里还需要新建一个“Application.mk”文件,该文件用来指定编译器生成对应平台的文件。
三:编写Application.mk文件
同样在“jni”文件夹再新建一个文件,文件名改“Application.mk”。
该文件名同样不可变更,选中“Application.mk”文件,右键用记事本打开,编写里面相关的配置代码。
这个文件很简单,只需要指定要编译哪些平台的文件,指定两个平台,一个是x86,另一个是arm,这里只需要编写一行代码即可,那就是APP_ABI := x86 armeabi-v7a,最后进行保存。
这里两个.mk文件已经编写完成,接下来使用ndk工具编译.c文件。
四:编译.c文件
首先打开cmd窗口,找到存放.mk以及.c代码的路径,是D:\first\jni, 在D盘下,所以先切换盘符至D盘,直接写入D即可,然后使用cd打开指定目录命令,cd到D:\first\jni目录,如下图所示。
随后输入ndk-build命令,回车编译可执行程序。看到cmd里面输出libs/x86/ yijindaxue和libs/armeabi-v7a/yijindaxue信息,就表示原生程序编译好了,如下图所示。
再回到D:\first目录,可以看到他自动给新建了两个文件夹,obj目录和libs目录。obj 目录下存放的是生成的中间文件,libs目录下存放的就是本课需要的可执行程序。
五:运行可执行程序
将这个可执行程序 yijindaxue,导入Android模拟器或者手机上运行,在这里使用模拟器来演示。
首先执行adb devices命令,检查设备是否正常连接,如下图所示。
然后使用adb push命令将目标程序拷贝到指定的Android设备上,这里默认放在/data/local/tmp目录下,当然也可以放在其他目录下。看到输出信息,就表示成功,如下图所示。
接下来输入adb shell命令,取得shell权限,由于在后面的操作中需要修改文件的权限,所以在这里还需要输入su命令取得root权限,为后面的操作做准备,如下图所示。
紧接着“cd”到之前指定的文件目录下,执行“ls –l”命令列出当前目录的文件,看到编译完成的可执行文件放进来了,如下图所示。
由于该文件还没有可执行权限,无法直接运行,此时需要给它一个权限,执行“chmod 777 目标文件名称”命令,程序就可以运行了,如下图所示。
输入“./目标文件名称”回车运行这个文件,然后就可以看到在cmd命令里面输出“易锦大学”这样一个字符串,这就代表可执行程序编写成功,如下图所示。
最后,给大家解答一下开篇提出的疑问,APP程序与可执行程序的区别有两个方面,第一,APP程序有文件后缀.apk,可执行程序没有文件后缀;第二,.apk文件是通过sdk工具进行打包的,可执行程序是通过NDK工具进行编译的。
小结:
主要学习了如何编译可执行程序,整体流程归纳总结起来,共有四个步骤:
(1)创建.c源文件,编写C代码。
(2)编写两个.mk文件:Android.mk & Application.mk。
(3)编译.c 文件,生成可执行程序。
(4)运行可执行程序。
以及编译过程中使用的相关命令:
cd 用于切换目录
chmod 为文件或目录赋权限
ls -l 列出当前文件夹下的所有文件及文件夹详细信息
如果你也对安卓逆向感兴趣。可以加下方的群,大家一起讨论问题,或者扫描下方二维码关注公众号,关注回复 “安卓逆向” 获取免费教程
安卓逆向交流学习:1139349849
vx:Yjxiaox