当使用gcc / g++编译共享库时,为什么-shared选项不包含-fPIC?或者,换句话说,在链接时是否需要选择-fPIC?
简而言之,我应该写:
gcc -c -fPIC foo.c -o foo.o
gcc -shared -fPIC foo.o -o libfoo.so // with -fPIC或以下各项已足够:
gcc -c -fPIC foo.c -o foo.o
gcc -shared foo.o -o libfoo.so // without -fPIC发布于 2018-02-07 01:17:47
构建在共享库中的代码通常应该是独立于位置的代码,但不是强制性代码,这样共享库就可以轻松地加载到内存中的任何地址。-fPIC选项确保GCC生成这样的代码。这不是必需的,因此在-shared中没有暗示,所以GCC给予了选择的自由。如果没有此选项,编译器可以对该位置相关代码进行一些优化。
如果一个进程希望在同一个虚拟地址中加载多个共享库,则位置相关代码可能会发生错误。由于图书馆无法预测其他库可以加载的内容,这个问题在传统的共享库概念中是不可避免的。虚拟地址空间在这里没有帮助。如果应用程序不使用许多其他共享库,并且它们在您的应用程序之前加载,则可以预测库的加载地址,并且可以将其定义为与位置相关的库的基址。
共享库应该在进程之间共享,可能不总是能够在两个进程中以相同的地址加载库。如果代码不独立于位置,那么每个进程都需要自己的副本。
https://stackoverflow.com/questions/48653522
复制相似问题