- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、Android动态链接器阅读笔记
二、android动态链接器简介
动态链接器本身也是一个共享对象,但事实上它具有一些特殊性。对于普通的共享对象
文件来说,它的重定位工作由动态链接器来完成;它也可以依赖于其他的共享对象,其中的
被依赖的共享对象由动态链接器负责连接和装载。
对于动态链接器linker来说,它不能依赖于任何共享对象,它本身所需要的全局和静
态变量的重定位工作,由它自身来完成。
三、linker 的工作原理
Android 的linker源代码在bionic\linker 中,读者可以下载一套源码。这里使用的是
android4.4的源码,其他版本的源码可能和该源码有所出入。
1.入口
一切程序都又一个入口函数。图中的那个__linker_init 即是linker 的入口函数。
从movpc,r0和上面的注释,可以知道,linker在init完成后,会把运行_entry 的地址返回给
pc寄存器。还把sp,#0 当做参数传入到__linker_init这个函数中。
2.自举
对于linker来说,它所需要的全局和局部变量,也需要重定位。那么完成这项任务的
代码叫做自举(Bootstrap)。
从注释上面可以看到,该段代码(该函数)复制修复自己的重定位,然后调用下一个函数。
下面也写的很清楚,该方法在linker修复自己的重定位表之前调用,所以任何尝试调用外部
变量,外部函数,或者外部全局重定位表的尝试,都会导致段错误。
2.1传入参数分解
有 可 以 一 个 KernelArgumentBlock 类 , 这 个 类 定 义 在 文 件
bionic/libc/private/KernelArgumentBlock.h 中。
当内核启动动态连接器,它 (内核)把一个指针传递给linker。这个指针指向一块这样的内
容:这块内容包含argc,argv数组,环境变量数组,elfaux数组。Elfaux是elf文件辅助信
息表,读者可以自行查阅资料。
取出raw_args 的地址,给args。我认为这里的raw_args应该是r0 中的内容。即把r0 中,也
就是sp 中的值作为首地址。然后,argc从该地址上数4个字节,为参数数量。Argv 的地址
从下面的4个字节,当然,要看参数的个数。Argv+argc+1,就是很好的证明,最后的+1,
是因为,参数字符串地址结束,是以0结束的,即有4个字节是0.
然后,跳过环境变量字符串。
跳过环境变量结束后的第二个空字符串,就到达了auxv 的地址处。
下面是aux分解的内容。
这个函数会根据type,找出所需要的类型。
就是这个结构。
2.2获取elf头地址,phdr地址
Auxval 的AT_BASE这个类型的数据中,存放了linker_addr 的地址,也就是elf文件头的地
址。依次获取elf_hdr,phdr。
2.3建立soinfo结构体并且填充
强烈注意最后一句,这里定义,linker还没有完成自举。这个值,是强制固定上去的。但
是,这里是在linker_init 的时候,才有的。也就是说,在对dlopen 的时候,这个FLAG_LINKER
是不会有的。
在计算phdr表所占用的大小的时候,是按照页对齐的。即size一定是页大小的整数倍。具
体代码可以跟进去看看。
这个函数的后面两个参数,没有被传进来。也不知道怎么编译通过的。这里是一个疑问点?
获取加载地址,实际上,就是第一个程序头的vaddr。Segment的第一个字节在进程的虚拟
地址空间的起始位置。
2.4 解析soinfo结构体,获取必要的信息。
我们要看的自举代码,还没有出现。应该就在这里面了。
系统,不希望soinfo_link_image发生错误。
2.5soinfo_link_image
已经进入到信息获取代码处了。最后一句,relocating_linker,当linker初始化的时候,该值为
1,其他时候,该值为0.初始化的时候,不会打印消息。dlopen 的时候,就会打印lo 了。
在自举完成之前,不能打印lo 。可以理解。其他函数,都没有加载,不知道用汇编代码,
强制打印lo ,可不可以。我觉得是可以的,毕竟汇编代码不需要操作系统的环境。
2.5提取动态链接段
下面是部分代码。
程序头中,type为PT_DYNAMIC 的就是动态链接段。
因为动态链接段的结构体为8个字节那么大,所以除以了8,得到了动态链接结构的数量。
2.6获取arm_linker_exidx结构
这个,在arm
您可能关注的文档
最近下载
- 人教版七年级英语上册 Starter Unit 1 单元测试卷(含答案) .pdf VIP
- 文旅集团招聘笔试试题附答案详解.docx VIP
- 20道中谷海运集团船舶船舶电机员岗位常见面试问题含HR常问问题考察点及参考回答.pdf VIP
- 以文塑旅 以旅彰文.docx VIP
- 小学科学教科版五年级上册全册课堂检测练习题(分单元课时编排,共28课)(2021新版).pdf VIP
- 人教版(2024新版)七年级上册英语Starter Unit1单元测试卷(含答案).docx VIP
- 盘扣架分包合同范本7篇.docx VIP
- 工业设计方法学全解.ppt
- 2024河南郑州文化旅游和体育集团有限公司社会化公开招聘34人笔试备考试题及答案解析.docx VIP
- 招标代理档案管理制度.docx VIP
文档评论(0)