Android系统的动态链接工具是/system/bin/linker(一般的Linux系统是ld.so),虽然名字不同,但是基本的动态链接过程是类似的。需要注意的一点是,Linux一般是Lazy,即所谓的“懒”加载方式,但是Android系统有点区别,是非Lazy方式,即所有的重定位操作,在进程首次执行以前已经全部完成。这大概也是Android应用首次启动比较慢的原因之一吧!
关于Android系统的PLT和GOT可以写上一篇高考作为,在这里就不提概念性的东西了,网上有一篇博文:http://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries ,这篇文章里是基于I386架构的,和Arm有所不同,但原理是一样的。如果有同学对下面的内容感兴趣,可以先去看看,把基本的东西先搞清楚,这样可能会顺利些,当然,最好了解些arm汇编~~~
还是老习惯,我会直接写个小Demo也演示Android系统的Linker是如何处理重定位的,当然,ELF重定位的类型非常多,我们这里重点关注:R_ARM_JUMP_SLOT(386架构上叫R_386_JUMP_SLOT,很像,不是么)。该类型重定位一般是针对外部函数引用的,即你要引用一个外部定义的函数符号,linker在加载你的应用的时候,就需要应用此种类型的重定位,来完成符号到真实函数的链接!
举例:比如你的应用需要打印一段文本到中断,你可能会调用libc.so这个C库的puts函数。这就是外部引用,那么在你的应用里就必定针对puts调用,存在一个R_ARM_JUMP_SLOT重定位信息。
先上一段非常小的程序:
/*
* PLT&GOT Resolver
* Created on: 2014-6
* Author: Chris.Z
*/
#include <stdio.h>
#include <stdlib.h>
/**
* define the local method
*
*/
void local_method_call()
{
printf("[+]I'm local method.\n");
}
int main()
{
//printf("[+]PLT&GOT Resolver...\n");
//local_m