【问题标题】:To use or not to use -fpic使用或不使用 -fpic
【发布时间】:2019-07-28 21:26:00
【问题描述】:

我的应用程序需要在运行时加载一种或多种算法,为此我使用 .so。问题是这些库没有被任何其他进程使用,但我的应用程序没有必要与其他人共享 .text 部分。 .so 的某些部分来自我预先编译的其他静态库。

在这种情况下,我还需要对静态文件使用 -fpic 标志吗?

编辑

我发现这篇文章article。在第 7 页,它指出“因此,如果性能对库或动态可加载模块很重要,您可以将其编译为非 PIC 代码。将模块编译为非 PIC 的主要缺点是加载时间增加,因为动态链接器在绑定符号时必须打大量的代码补丁。”

【问题讨论】:

    标签: c gcc compiler-optimization fpic


    【解决方案1】:

    是的,你知道。将使用dlopen 加载的任何内容都必须使用-fpic(或-fPIC)进行编译。

    这不是关于共享文本段,而是关于访问全局数据的不同规则(包括您可能没有意识到全局数据的东西,例如使用的“过程链接表”蹦床在全局函数之间调用)在主可执行文件和共享库中。

    【讨论】:

    • 我找到了这篇文章cseweb.ucsd.edu/~gbournou/CSE131/…。在第 7 页,它指出“因此,如果性能对库或动态可加载模块很重要,您可以将其编译为非 PIC 代码。将模块编译为非 PIC 的主要缺点是加载时间增加,因为动态链接器在绑定符号时必须打大量的代码补丁。”
    • 我不介意额外的加载时间,但我会介意 -fpic 在算法运行期间是否会增加一些性能开销。
    • @user1934513 那篇文章很老了,它所说的仅适用于带有 Linux 的 32 位 x86。对于 CPU 和操作系统的任何其他组合,必须将共享对象编译为 PIC。
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 2011-11-30
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多