gpt4 book ai didi

c++ - -fPIC 仅适用于共享库吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:23 25 4
gpt4 key购买 nike

我知道 -fPIC 是共享库所必需的,并且知道为什么。

但是,我对这个问题不是很清楚:

-fPIC 不应在构建可执行文件或静态库期间使用吗?

最佳答案

Should -fPIC never be used during building an executable or a static library?

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

使用 -fPIC 构建的代码(稍微)不太理想,那么为什么要将它放入共享库以外的任何地方?

让我们从静态库开始,答案很简单。

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

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

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

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

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

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

TL;DR:将 -fPIC 对象放入可执行文件和静态库中有它的位置,您应该了解您这样做的原因(如果您最终这样做)。

更新:

Code in an object file is always relocatable

正确。

is it position-independent code?

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

位置无关代码是可重定位代码的子集。可重定位代码可以具有适用于任何 部分的重定位。与位置无关的代码必须.text(和.rodata)进行任何重定位。

关于c++ - -fPIC 仅适用于共享库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49503475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com