首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc -fPIC诉-shared

gcc -fPIC诉-shared
EN

Stack Overflow用户
提问于 2018-02-06 23:17:41
回答 1查看 8.6K关注 0票数 14

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

简而言之,我应该写:

代码语言:javascript
复制
gcc -c -fPIC foo.c -o foo.o
gcc -shared -fPIC foo.o -o libfoo.so  // with -fPIC

或以下各项已足够:

代码语言:javascript
复制
gcc -c -fPIC foo.c -o foo.o
gcc -shared foo.o -o libfoo.so // without -fPIC
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 01:17:47

构建在共享库中的代码通常应该是独立于位置的代码,但不是强制性代码,这样共享库就可以轻松地加载到内存中的任何地址。-fPIC选项确保GCC生成这样的代码。这不是必需的,因此在-shared中没有暗示,所以GCC给予了选择的自由。如果没有此选项,编译器可以对该位置相关代码进行一些优化。

如果一个进程希望在同一个虚拟地址中加载多个共享库,则位置相关代码可能会发生错误。由于图书馆无法预测其他库可以加载的内容,这个问题在传统的共享库概念中是不可避免的。虚拟地址空间在这里没有帮助。如果应用程序不使用许多其他共享库,并且它们在您的应用程序之前加载,则可以预测库的加载地址,并且可以将其定义为与位置相关的库的基址。

共享库应该在进程之间共享,可能不总是能够在两个进程中以相同的地址加载库。如果代码不独立于位置,那么每个进程都需要自己的副本。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48653522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档