星空网 > 软件开发 > 操作系统

了解动态链接(二)—— 地址无关代码

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

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

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

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


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

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

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

了解动态链接(二)—— 地址无关代码images/loading.gif' data-original="http://images0.cnblogs.com/blog2015/763648/201506/210827350132400.png" />

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

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




原标题:了解动态链接(二)—— 地址无关代码

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

PO Box(邮政信箱):https://www.ikjzd.com/w/1573203625900761089
POD Conect:https://www.ikjzd.com/w/1573203632481280001
PODTurbo:https://www.ikjzd.com/w/1573203633119158273
PointerBP:https://www.ikjzd.com/w/1573203633731526657
波兰电商:https://www.ikjzd.com/w/1573203634260008961
筋斗云ERP:https://www.ikjzd.com/w/1573203634855600130
无锡旅游景点竹海 - 无锡的竹海:https://www.vstour.cn/a/363178.html
5月贾汪好玩的地方 贾汪哪有好玩的地方:https://www.vstour.cn/a/363179.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流