zoukankan      html  css  js  c++  java
  • 了解动态链接(二)—— 地址无关代码

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287

    把指令中需要修改的部分剥离出来,放到数据区,保持指令部分不变,数据部分可以由每个进程拥有一个副本。这就是——地址无关代码 (Position-independent Code, PIC),好处是实现指令部分由多进程共享,节省内存。

    要实现 PIC,就得解决指令中的地址定位问题。指令中的地址引用可分为:

    1、模块内部的函数调用和变量访问;

    2、模块外部的函数调用和变量访问。

    第 1 种情况,由于大家都在同一个模块中定义,相互之间有一定的相对位置,所以可以通过相对地址调用解决问题。

    第 2 种情况,也就是对于模块外部的访问,需要在数据区建立一个全局偏移表 (GOT),里面存放外部变量或函数的地址。当然,GOT 表中的地址需要链接器在装载模块,进行地址重定位时进行填充。这样对于指令中的外部符号访问,可以先通过相对地址找到 GOT 表中相关的项,再由其得到目标变量或函数的具体地址。

    在 Android 系统中,针对外部的变量和函数引用会有两个重定位表,所以连续调用 soinfo_relocate 两次分别进行重定位:

    最后,使用 “readelf –d xxx.so | grep TEXTREL” 命令可以查看 xxx.so 是否是 PIC 的,因为 PIC 的 so 不会包含任何代码段重定位表,所以不会有任何输出。

    学习资料: 《程序员的自我修养——链接、装载和库》

  • 相关阅读:
    41:和为S的两个数
    40:数组中只出现一次的数字
    39-2:平衡二叉树
    39:二叉树的深度
    38:数字在排序数组中出现的次数
    37:两个链表的第一个公共结点
    36:数组中的逆序对
    35:第一个只出现一次的字符
    34:丑数
    33:把数组排成最小的数
  • 原文地址:https://www.cnblogs.com/ilocker/p/4591486.html
Copyright © 2011-2022 走看看