程序员的自我修养 8.8分
读书笔记 动态链接
knightley
7.3.3 地址无关代码
那么什么是“-fPIC”呢?使用这个参数会有什么效果呢?
装载时重定位是解决动态模块中有绝对地址引用的方法之一,但是它有一个很大的缺点是指令部分无法在多个进程之间共享,这样就失去了动态链接节省内存的一大优势。我们还需要有一种更好的方法解决共享对象指令中对绝对地址的重定位问题。其实我们的目的很简单,希望程序模块中共享的指令部分在装载时不需要因为装载地址的改变而改变,所以实现的基本想法就是把指令中那些需要被修改的部分分离出来,跟数据部分放在一起,这样指令部分就可以保持不变,而数据部分可以在每个进程中拥有一个副本。这种方案就是目前被称为地址无关代码(PIC,Postion Independent Code)的技术。
对于现代的机器来说,产生地址无关的代码并不麻烦。我们先来分析模块中各种类型的地址引用方式。这里我们把共享对象模块中的地址引用按照是否跨模块分为两类:模块内部引用和模块外部引用;按照不同的引用方式又可以分为指令引用和数据访问,这样我们就得到了如图7-4中的4种情况。
下面开始分别介绍四种情况的PIC处理方法。。。。。。

引入地址无关代码PIC的定义。然后开始分类介绍实现方法,具体见本小节后面的内容。

0
《程序员的自我修养》的全部笔记 294篇
豆瓣
免费下载 iOS / Android 版客户端