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

如果在可执行文件中使用gcc-fPIC标志编译对象,会有什么影响(如果有的话)?,gcc,shared-libraries,executable,fpic,Gcc,Shared Libraries,Executable,Fpic,我正在为我正在进行的一个项目整理一个生成文件。我在项目中有一个可执行文件和一个共享库。两者都使用一些相同的源文件,这些源文件被分别编译成目标文件。为了能够在共享库中使用这些对象,我需要在gcc中使用-fPIC(位置独立代码)标志。使用-fPIC编译可执行文件中使用的对象有什么影响吗?编译位置无关代码在某些平台上(最明显的是,缺少寄存器的x86体系结构,因为PIC拿走了一个寄存器,在非PIC时可以更自由地使用它),但除此之外,不应有任何有害影响 更进一步,甚至可以创建一个位置独立的可执行文件(-f

我正在为我正在进行的一个项目整理一个生成文件。我在项目中有一个可执行文件和一个共享库。两者都使用一些相同的源文件,这些源文件被分别编译成目标文件。为了能够在共享库中使用这些对象,我需要在gcc中使用-fPIC(位置独立代码)标志。使用-fPIC编译可执行文件中使用的对象有什么影响吗?

编译位置无关代码在某些平台上(最明显的是,缺少寄存器的x86体系结构,因为PIC拿走了一个寄存器,在非PIC时可以更自由地使用它),但除此之外,不应有任何有害影响

更进一步,甚至可以创建一个位置独立的可执行文件(
-fPIE
),该文件仅由位置独立的代码构建


也就是说,它可以为编译的每个源文件自动生成PIC和非PIC对象,即使在没有libtool集成的构建系统中也应该很容易做到这一点。

没有PIC不会在x86上删除寄存器。此CPU没有位置间接代码,因此总是向数据/函数添加间接代码。在x86上完全可以忽略-fPIC,因为如果不指定它,则会得到快速代码,链接器会复制每个可执行文件的代码段。@x86-32上的Lothar,根据编译器的不同,PIC会删除一个寄存器。5.0之前的GCC保留了ebx,使其不能用于一般用途。看起来GCC7现在需要使用-fPIC编译所有内容。至少我得到了n个错误,并且在搜索为什么我会得到这个错误时发现了这个问题?@Lothar不,它一般不需要它。您是否混合使用和不使用
-fPIC
编译的对象?