首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC -fPIC期权

GCC -fPIC期权
EN

Stack Overflow用户
提问于 2011-03-15 12:12:16
回答 6查看 348K关注 0票数 550

我读过关于GCC对代码生成公约的选择的文章,但不明白“生成位置无关代码”的作用。请举一个例子来解释这是什么意思。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-03-15 12:13:56

位置独立代码意味着生成的机器代码不依赖于位于特定地址才能工作。

跳转将以相对而非绝对的形式产生。

伪装配:

PIC:无论代码是在地址100还是1000,这都可以工作。

代码语言:javascript
复制
100: COMPARE REG1, REG2
101: JUMP_IF_EQUAL CURRENT+10
...
111: NOP

非PIC:只有当代码位于地址100时才能工作。

代码语言:javascript
复制
100: COMPARE REG1, REG2
101: JUMP_IF_EQUAL 111
...
111: NOP

编辑:回应评论。

如果您的代码是用-fPIC编译的,那么它适合包含在库中--库必须能够从内存中的首选位置重新定位到另一个地址,在您的库喜欢的地址上可能有另一个已经加载的库。

票数 674
EN

Stack Overflow用户

发布于 2011-05-29 11:45:50

我将尝试用一种简单的方式解释已经说过的话。

每当加载共享库时,加载程序(加载您运行的任何程序的OS上的代码)将根据对象加载到的位置更改代码中的某些地址。

在上面的例子中,非PIC代码中的"111“是由加载器在第一次加载时编写的。

对于非共享对象,您可能希望它是这样的,因为编译器可以对该代码进行一些优化。

对于共享对象,如果另一个进程想要“链接”到该代码,它必须将其读取到相同的虚拟地址,否则"111“就没有意义了。但这个虚拟空间可能已经在第二个过程中使用了。

票数 78
EN

Stack Overflow用户

发布于 2011-03-15 12:25:13

构建在共享库中的代码通常应该是与位置无关的代码,这样共享库就可以轻松地加载到(或多或少)内存中的任何地址。-fPIC选项确保GCC生成这样的代码。

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

https://stackoverflow.com/questions/5311515

复制
相关文章

相似问题

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