我读过关于GCC对代码生成公约的选择的文章,但不明白“生成位置无关代码”的作用。请举一个例子来解释这是什么意思。
发布于 2011-03-15 12:13:56
位置独立代码意味着生成的机器代码不依赖于位于特定地址才能工作。
跳转将以相对而非绝对的形式产生。
伪装配:
PIC:无论代码是在地址100还是1000,这都可以工作。
100: COMPARE REG1, REG2
101: JUMP_IF_EQUAL CURRENT+10
...
111: NOP非PIC:只有当代码位于地址100时才能工作。
100: COMPARE REG1, REG2
101: JUMP_IF_EQUAL 111
...
111: NOP编辑:回应评论。
如果您的代码是用-fPIC编译的,那么它适合包含在库中--库必须能够从内存中的首选位置重新定位到另一个地址,在您的库喜欢的地址上可能有另一个已经加载的库。
发布于 2011-05-29 11:45:50
我将尝试用一种简单的方式解释已经说过的话。
每当加载共享库时,加载程序(加载您运行的任何程序的OS上的代码)将根据对象加载到的位置更改代码中的某些地址。
在上面的例子中,非PIC代码中的"111“是由加载器在第一次加载时编写的。
对于非共享对象,您可能希望它是这样的,因为编译器可以对该代码进行一些优化。
对于共享对象,如果另一个进程想要“链接”到该代码,它必须将其读取到相同的虚拟地址,否则"111“就没有意义了。但这个虚拟空间可能已经在第二个过程中使用了。
发布于 2011-03-15 12:25:13
构建在共享库中的代码通常应该是与位置无关的代码,这样共享库就可以轻松地加载到(或多或少)内存中的任何地址。-fPIC选项确保GCC生成这样的代码。
https://stackoverflow.com/questions/5311515
复制相似问题