-fPIC 仅适用于共享库吗?

2024-02-18

I know -fPIC对于共享库是必要的并且知道为什么。

不过,我对这个问题并不清楚:

Should -fPIC在构建可执行文件或静态库期间永远不会使用?


Should -fPIC在构建可执行文件或静态库期间永远不会使用?

从不是一个很强烈的词,上面的陈述是错误的。

代码构建于-fPIC(稍微)不太理想,那么为什么你想将它放入共享库以外的任何东西中呢?

让我们从静态库开始,它有一个简单的答案。

假设您想为用户提供一个可以链接到的静态库either一个可执行文件,or进入他们自己的共享库?

在那种情况下你must要么给他们 3 个独立的存档库(其中一个是用-fPIC用于链接到共享库,该库是用-fPIE用于链接到 PIE 可执行文件和“常规”可执行文件),或者您可以为它们提供一个存档库(必须使用以下代码构建代码)-fPIC).

现在,可能有人会说您应该给他们一个共享库,但这会迫使您的最终用户分发 2 个二进制文件,而他们可能宁愿不这样做。

但是假设您想要构建一个常规(非 PIE)可执行文件。链接的原因可能是什么-fPIC代码到这样的可执行文件中?

好吧,假设您处于开发阶段,并且还不太关心优化代码。进一步假设您想将代码作为共享库进行测试,and作为 PIE 和非 PIE 可执行文件的一部分。

在上述条件下,您可以编译代码 3 次(有或没有-fPIC, 与-fPIE), or你可以编译一次(用-fPIC)并将其链接到所有 3 个共享库、PIE 和非 PIE 可执行文件。这样做可以节省大量编译时间,并降低构建系统的复杂性。

TL;DR:推杆-fPIC将对象转换为可执行文件和静态库有其一席之地,您应该了解这样做的原因(如果您最终这样做的话)。

Update:

目标文件中的代码始终是可重定位的

Correct.

它是位置无关的代码吗?

否:并非所有可重定位代码都是位置无关的。

与位置无关的代码是subset可重定位代码。可重定位代码可以具有适用于的重定位any部分。位置无关的代码必须not有任何搬迁反对.text (and .rodata).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

-fPIC 仅适用于共享库吗? 的相关文章

随机推荐