gcc -fPIC与-shared

Gre*_*g82 5 c++ gcc g++ shared-libraries

使用gcc / g ++编译共享库时,为什么选项-fPIC未隐含-shared?或者换句话说,-fPIC在链接时是否需要该选项?

简而言之,我应该写:

gcc -c -fPIC foo.c -o foo.o
gcc -shared -fPIC foo.o -o libfoo.so  // with -fPIC
Run Code Online (Sandbox Code Playgroud)

或以下条件是否足够:

gcc -c -fPIC foo.c -o foo.o
gcc -shared foo.o -o libfoo.so // without -fPIC
Run Code Online (Sandbox Code Playgroud)

S.M*_*.M. 5

内置到共享库中的代码通常(但不是必须)是与位置无关的代码,以便可以轻松地将共享库加载到内存中的任何地址。的-fPIC选项确保GCC产生这样的代码。它不是必需的,因而它不是在暗示-shared所以GCC给出了选择的自由。没有此选项,编译器可以对该位置相关的代码进行一些优化。

如果一个进程要在同一虚拟地址上加载多个共享库,则位置相关代码可能会发生错误。由于库无法预测可以加载哪些其他库,因此传统的共享库概念无法避免此问题。虚拟地址空间在这里无济于事。如果您的应用程序不使用很多其他共享库,并且它们是在您之前加载的,则可以预测该库的加载地址,并将其定义为与位置相关的库的基址。

共享库应该在进程之间共享,因此可能无法始终在两个库中的相同地址处加载该库。如果代码不是位置无关的,则每个过程将需要自己的副本。