使用或不使用-fpic
To use or not to use -fpic
我的应用程序需要在 运行 时间加载一个或多个算法,为此我使用 .so。问题是这些库除了我的应用程序之外没有被任何其他进程使用,所以不需要与其他人共享 .text 部分。 .so 的某些部分来自我预先编译的其他静态库。
在这种情况下,我是否还必须为静态文件使用 -fpic 标志?
编辑
我找到这篇文章 article。在第 7 页,它指出 "So, if performance is important for a library or dynamically loadable module, you can compile it as non-PIC code. The primary downside to compiling the module as non-PIC is that loading time in-creases because the dynamic linker must make a large number of code patches when binding symbols."
是的,你知道。将使用 dlopen
加载的任何内容都必须使用 -fpic
(或 -fPIC
)进行编译。
这不是共享文本段,而是关于访问全局数据的不同规则(包括您可能没有意识到的东西是全局数据,例如"procedure linkage table" trampolines used to call between global functions) in the main executable vs in shared libraries.
我的应用程序需要在 运行 时间加载一个或多个算法,为此我使用 .so。问题是这些库除了我的应用程序之外没有被任何其他进程使用,所以不需要与其他人共享 .text 部分。 .so 的某些部分来自我预先编译的其他静态库。
在这种情况下,我是否还必须为静态文件使用 -fpic 标志?
编辑
我找到这篇文章 article。在第 7 页,它指出 "So, if performance is important for a library or dynamically loadable module, you can compile it as non-PIC code. The primary downside to compiling the module as non-PIC is that loading time in-creases because the dynamic linker must make a large number of code patches when binding symbols."
是的,你知道。将使用 dlopen
加载的任何内容都必须使用 -fpic
(或 -fPIC
)进行编译。
这不是共享文本段,而是关于访问全局数据的不同规则(包括您可能没有意识到的东西是全局数据,例如"procedure linkage table" trampolines used to call between global functions) in the main executable vs in shared libraries.