PIC指的是位置无关代码,用于生成位置无关的共享库,所谓位置无关,指的是共享库的代码断是只读的,存放在代码段,多个进程可同时公用这份代码段而不需要拷贝副本。库中的变量(全局变量和静态变量)通过GOT表访问,而库中的函数,通过PLT->GOT->函数位置进行访问。

选项 -fpie和 -fPIE与 -fpic及 -fPIC的用法很相似,区别在于前者总是将生成的位置无关代码看作是属于程序本身,并直接链接进该可执行程序,而非存入全局偏移表 GOT中

用PIE编译生成动态库,不会为全局变量在GOT表中创建对应的条目,生成位置无关的可执行程序,在连接时所有的变量都已经确定好了,包括全局的对外可见变量也默认视为程序内部变量。

较新版本的GNC编译器默认开始使用PIC / PIE进行编译