原生程序有静态链接和动态链接两种,其中动态链接又分为动态链接程序和动态链接库。
静态链接:需要在gcc编译参数中指定 -Bstatic,在生成可执行程序时会链接crtbegin_static.o 和 ctrend_android.o目标文件。crtbegin_static.o中定义了静态链接程序的启动函数_start,这是程序启动时执行的第一个函数。
动态链接:gcc指定参数 -Bdynamic, 在生成动态链接程序时会链接crtbegin_dynamic.o和ctrend_dynamic.o目标文件,并且动态链接时需要通过--dynamic-linker参数指定程序的“加载器”,默认为"/system/bin/linker"。动态链接程序的启动函数_start位于crtbegin_dynamic.o中。
无论静态还是动态链接,在链接时都会传入一个链接脚本(位于android NDK toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/ldscripts中),默认传入的是armelf_linux_eabi.x 脚本,该文件中指出程序入口函数为_start。
动态链接库:
在生成动态链接库时会链接crtbegin_so.o和crtend_so.o目标文件。
系统加载so,在完成装载、映射和重定向以后,就首先执行.init和.init_array段的代码,之后如果存在JNI_OnLoad就调用该函数.我们要对一个so进行分析,需要先看看有没有.init_array section和.init section,so加壳一般会在初始化函数进行脱壳操作。
原生C文件逆向分析:
1.用objdump
2. IDA Pro (没有找到IDA Pro的IOS版本 无法进行试验。。只好只看下教程了。)
android 原生程序 native code 的启动流程分析
原文:http://www.cnblogs.com/CarrieCui/p/5118996.html