首页 > 移动平台 > 详细

android 原生程序 native code 的启动流程分析

时间:2016-01-10 21:16:05      阅读:300      评论:0      收藏:0      [点我收藏+]

原生程序有静态链接和动态链接两种,其中动态链接又分为动态链接程序和动态链接库。

静态链接:需要在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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!