第三章 linker阅读笔记一.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档