繁体   English   中英

共享库只有-fPIC吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM