为了避免共享库的诸多问题,现代系统以这样一种方式编译共享模块的代码段,使得可以把它们加载到内存的任何位置而无需链接器修改
无限多个进程可以共享一个共享模块的代码段的单一副本
当然,每个进程仍然会有它自己的读/写数据块
可以加载而无需重定位的代码称为位置无关代码(Position-Independent Code,PIC)
用户对 GCC 使用 -fpic 选项指示 GNU 编译系统生成 PIC 代码,共享库的编译必须总是使用该选项
在一个 x86-64 系统中,对同一个目标模块中符号的引用是不需要特殊处理使之成为 PIC,可以用 PC 相对寻址来编译这些引用,构造目标文件时由静态链接器重定位
然而,对共享模块定义的外部过程和对全局变量的引用需要一些特殊的技巧