![](/img/trans.png)
[英]is g++ -fPIC applicable for executable too in addition to shared libraries?
[英]Is -fPIC for shared libraries ONLY?
我知道-fPIC
是共享库所必需的,并知道原因。
但是,我不清楚这个问题:
在构建可执行文件或静态库时,是否应该-fPIC
?
在构建可执行文件或静态库时,是否应该
-fPIC
?
永远不是一个强硬的词,上面的陈述是错误的。
使用-fPIC
构建的代码(略微)不太理想,那么为什么要将它放入除共享库之外的任何其他内容?
让我们从一个静态库开始,它有一个简单的答案。
假设你想给你的用户,可以链接到任何可执行文件, 或到自己的共享库静态库?
在这种情况下,你必须给它们3个独立的归档库(一个用-fPIC
构建,用于链接到共享库,一个用-fPIE
构建,用于链接到PIE可执行文件,和一个“常规”),或者你可以给它们一个归档库(必须使用-fPIC
构建代码)。
现在,可以说你应该给它们一个共享库,但这会迫使你的最终用户分发2个二进制文件,他们可能不愿意这样做。
但是假设您要构建常规(非PIE)可执行文件。 将-fPIC
代码链接到这样的可执行文件中的原因是什么?
好吧,假设您处于开发阶段,并且不关心优化代码。 进一步假设您要将代码作为共享库进行测试, 并将其作为PIE和非PIE可执行文件的一部分进行测试。
在上述条件下,您可以编译代码3次(使用和不-fPIC
,使用-fPIE
), 或者可以编译一次(使用-fPIC
)并将其链接到所有3个共享库,PIE和非PIE可执行文件。 这样做可以节省大量的编译时间,有些还可以构建系统复杂性。
TL; DR:将-fPIC
对象放入可执行文件和静态库中就有它的位置,你应该理解为什么要这样做(如果你最终这样做)。
更新:
目标文件中的代码始终可重定位
正确。
它是与位置无关的代码吗?
否:并非所有可重定位代码都与位置无关。
与位置无关的代码是可重定位代码的子集 。 可重定位代码可以具有适用于任何部分的重定位。 与位置无关的代码不得对.text
(和.rodata
)进行任何重定位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.