编译为与位置无关的代码时,为什么我的共享库会大得多?

时间:2017-09-09 13:57:46

标签: c gcc compilation

我正在编写一个静态链接SDL2的共享库。因此,我使用-fPIC编译SDL2和我的共享库。我注意到,如果不使用-fPIC,最终共享库大小约为940千字节,而-fPIC最终共享库大小约为1.4兆字节。

为什么使用-fPIC编译时共享库比没有-fPIC编译时大得多?

测试是在Raspberry Pi 2上完成的,因此目标架构是ARMv7A或ARMv8(A)。

1 个答案:

答案 0 :(得分:0)

简单地说:使代码与位置无关是有开销的。

在非位置无关代码中,编译器可以在访问全局数据时简单地发出对固定地址的引用。对于PIC,通常涉及全局偏移表(GOT);编译器必须首先发出附加代码才能访问GOT。对于其他功能的引用也是如此;使用PIC,这些调用将通过过程查找表(PLT)。

这种额外的间接级别会导致必要的大小增加。