android linker (1) —— __linker_init()
linker(动态链接器,也称解释器)本身也是一个 shared object,__linker_init() 负责初始化 linker,完成 linker 的重定位等工作。由于在调用 __linker_init() 之前,linker 的重定位还没有完成(GOT还不可用),所以任何对外部变量或函数的引用都会产生 segfault。
由于 linker 的重定位由其自己完成,所以该过程称为 bootstrap(自举)。
__linker_init() 的第一步是分解参数,把由 sp 参数传入的 argc、argv、环境变量、ELF aux vectors 分别装入KernelArgumentBlock 对象的相应成员中,方便访问。
在 auxv 数组中,类型为 AT_BASE 的项存储有 linker 镜像的开始地址。__linker_init() 由此得到 linker_addr,继而得到 elf_hdr(elf header) 和 phdr(program header) 的地址。
__linker_init() 接着填充一个 soinfo 结构变量。
成员 flags 设置上 FLAG_LINKER,后面见此标记就不会打印调试信息,因为那些调试函数在 linker 完成重定位前尚不可用。
phdr_table_get_load_size() 计算整个 linker 镜像的大小,方法是根据 program header ,找到段内存的最大地址和最小地址,在完成页对齐之后相减。
get_elf_exec_load_bias() 得到 linker 在内存中的加载地址,实际上是第一个可加载段(PT_LOAD)在内存中的虚拟地址。
上面描述有误,get_elf_exec_load_bias() 只是计算第一个 LOAD 段在文件中的偏移 p_offset 与其在内存中的偏移 p_vaddr 的一个差值,然后再加上该 elf 文件在内存中的基址。在后面使用时,比如从 LOAD 段里找 .dynamic 时:*dynamic = reinterpret_cast<ElfW(Dyn)*>(load_bias + phdr->p_vaddr);,只需要由 load_bias 加上 .dynamic 的 p_vaddr 就能得到 .dynamic 在内存中的虚拟地址了。
__linker_init() 接着以 linker_so 作为参数,调用 soinfo_link_image()。
在 soinfo_link_image() 中先找到动态链接段(PT_DYNAMIC)的地址,并得到动态链接结构的数量。然后遍历所有动态链接结构,获取诸如“字符串表地址”、“符号表地址”、“重定位表地址”等重要信息,填充到 soinfo 结构的相应成员中。接着加载所有依赖库,但其实在 linker 自举过程中,它并不依赖于任何其他shared object。重定位工作也是在 soinfo_link_image() 中完成,包括 rel 和 plt_rel(与 PLT 关联的重定位项)。
__linker_init() 最后调用 __linker_init_post_relocation(),从名字可以看出,那些需要在重定位之后才能进行的工作都在这个函数中完成。
__linker_init() 最后返回镜像的入口地址,也就是 elf header 中的 e_entry 保存的虚拟地址。
android linker (1) —— __linker_init()的更多相关文章
- Android Linker简介
简单介绍Android linker的基础知识,基于Android 10分支. linker的作用 考虑简单的HelloWorld程序. $ tree . . |-- jni | |-- Androi ...
- 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 作者:王赛 1. 前言 Andr ...
- Android Linker 与 SO 加壳技术
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...
- 简单粗暴的对android so文件加壳,防止静态分析
转载自http://bbs.pediy.com/showthread.php?t=191649 以前一直对.so文件加载时解密不懂,不了解其工作原理和实现思路.最近翻看各种资料,有了一些思路.看到论坛 ...
- Android Native 程序逆向入门(一)—— Native 程序的启动流程
八月的太阳晒得黄黄的,谁说这世界不是黄金?小雀儿在树荫里打盹,孩子们在草地里打滚.八月的太阳晒得黄黄的,谁说这世界不是黄金?金黄的树林,金黄的草地,小雀们合奏着欢畅的清音:金黄的茅舍,金黄的麦屯,金黄 ...
- android app启动过程(转)
Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...
- android app启动过程
Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...
- Android逆向之旅---基于对so中的section加密技术实现so加固
一.前言 好长时间没有更新文章了,主要还是工作上的事,连续加班一个月,没有时间研究了,只有周末有时间,来看一下,不过我还是延续之前的文章,继续我们的逆向之旅,今天我们要来看一下如何通过对so加密,在介 ...
- android so壳入口浅析
本文转自http://www.9hao.info/pages/2014/08/android-soke-ru-kou-q 前言 开年来开始接触一些加固样本,基本都对了so进行了处理,拖入ida一看 ...
随机推荐
- [转]easyui datagrid 批量编辑和提交
web前台主要代码: <script type="text/javascript"> $(function() { var $dg = $("#dg" ...
- Ext.GridPanel 用法总结(一)—— Grid基本用法
Ext.GridPanel 用法总结(一)—— Grid基本用法 摘自:http://www.cnblogs.com/luluping/archive/2009/08/01/1536645.html ...
- jquery ajax 用 data 和 headers 向 java RESTful 传递参数区别
jquery 的 ajax 是非常方便的一个函数,记录一下 $.ajax 生成的 http 报文 一.使用 data 传递参数: $.ajax({ url : "webrs/test/add ...
- Dubbo初探
Dubbo是什么? 1.阿里巴巴开源项目.2.Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. ps: SOA(面相服务的体系结构) RPC( ...
- innerHTML和outerHTML有什么区别
一.区别:1)innerHTML: 从对象的起始位置到终止位置的全部内容,不包括Html标签.2)outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身. 二.例子1: & ...
- java事务理解
还在学Hibernate,后续一大堆概念刚接触需要理解.觉得-——事务——这个概念不是很好理解,所以发上来记录一下. 首先说点千篇一律的东西.概念和特性都是随处可见的,无论哪里都很容易找到,关键是你如 ...
- 【原创】使用.NET Core 1.0创建一个Self-Contained控制台应用
开发机器:win7-x64 .NET Core版本:1.0.0-preview2-003121 Visual Studio Code:1.2.1 至于什么是Self-Contained应用类型以及与P ...
- ASP.NET Web API默认支持的媒体类型(SupportedMediaTypes)
JsonMediaTypeFormatter XmlMediaTypeFormatter ( application/xml text/xml) FormUrlEncodedMediaTypeFor ...
- Mysql进阶(二)
一.触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 创建视图 # 插入前CREATE TRIGGER ...
- 【GOF23设计模式】装饰模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_装饰模式.IO流底层架构.装饰和桥接模式的区别 package com.test.decorator; /** * Com ...