我正在编写一个静态链接SDL2的共享库。因此,我使用-fPIC
编译SDL2和我的共享库。我注意到,如果不使用-fPIC
,最终共享库大小约为940千字节,而-fPIC
最终共享库大小约为1.4兆字节。
为什么使用-fPIC
编译时共享库比没有-fPIC
编译时大得多?
测试是在Raspberry Pi 2上完成的,因此目标架构是ARMv7A或ARMv8(A)。
答案 0 :(得分:0)
简单地说:使代码与位置无关是有开销的。
在非位置无关代码中,编译器可以在访问全局数据时简单地发出对固定地址的引用。对于PIC,通常涉及全局偏移表(GOT);编译器必须首先发出附加代码才能访问GOT。对于其他功能的引用也是如此;使用PIC,这些调用将通过过程查找表(PLT)。
这种额外的间接级别会导致必要的大小增加。