如果使用gcc -fPIC标志编译对象并在可执行文件中使用,会有什么影响(如果有的话)?

12

我正在为一个项目编写makefile。这个项目中包含可执行文件和共享库。两者都使用一些相同的源文件,这些文件会被分别编译成对象文件。为了能够在共享库中使用这些对象,我需要在gcc中使用-fPIC(位置独立代码)标志。使用-fPIC编译对象文件后是否有任何影响,可以用于可执行文件?


看起来GCC7现在要求使用-fPIC编译所有内容。至少我得到了一个错误,并在搜索中发现了这个问题,为什么会出现这个错误? - Lothar
@Lothar 不需要一般情况下。你是在混合编译使用和不使用“-fPIC”选项的对象吗? - ephemient
1个回答

9
在某些平台上(尤其是寄存器匮乏的x86架构,因为PIC会占用一个可以在非PIC情况下更自由使用的寄存器),即使不必要地编译位置无关代码也会降低性能。但除此之外,不应该有任何不利影响。
进一步地,甚至可以创建仅由位置无关代码构建的位置无关可执行文件(-fPIE)。
话虽如此,libtool 可以自动为每个编译的源文件生成PIC和非PIC对象,即使在没有libtool集成的构建系统中,也应该很容易做到同样的事情。

没有PIC会在x86上占用寄存器。这个CPU没有位置间接代码,因此始终向数据/函数添加间接引用。在x86上完全可以忘记-fPIC,因为如果不指定它,你将获得快速的代码,并且链接器会为每个可执行文件复制代码段。 - Lothar
@Lothar 在 x86-32 上,根据编译器的不同,PIC 确实会占用一个寄存器。GCC 5.0 之前的版本会保留 %ebx 寄存器,因此无法进行通用使用。详情请参见 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232。 - ephemient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接