4

有人可以解释为什么我应该对编译与位置无关的代码感兴趣,以及为什么我应该避免它?

4

3 回答 3

5

使代码位置独立增加了一个抽象层,这需要在运行时对某些操作进行额外的查找步骤(通常与使用静态存储访问变量有关)。

因此,如果您不需要它,请不要使用它!

在某些特定情况下,您必须生成 PIC(即在创建运行时可加载代码时,例如插件模块或库),但增加的灵活性是有代价的。

于 2012-09-15T18:26:19.000 回答
4

血淋淋的细节取决于您的加载器如何处理您是构建可执行文件还是库,但从某种意义上说,这完全是构建系统和编译器的问题,而不是您的问题。

如果您真的想了解,您需要考虑在执行开始之前代码在地址空间中的位置以及您的芯片提供的分支指令集。分支是相对的还是绝对的?对数据段的访问是相对的还是绝对的?

  • 如果分支是绝对的,那么代码必须加载到可靠的地址,否则它将无法工作。那是位置相关的代码。许多简单(或较旧)的操作系统通过始终将程序加载到同一位置来适应这一点。

  • 相对分支意味着可以放置在内存中的任何位置。那是与位置无关的代码。


同样,您需要知道的只是在您的平台上调用编译器和链接器的方法。

于 2012-09-15T18:28:24.910 回答
1

PIC 代码通常必须稍大一些,因为编译器不能使用编码相对地址偏移的指令。如果没有 PIC,许多地址可以用相对于当前 PC 的 16 位或 8 位进行编码。有时在嵌入式系统中,PIC 很有用。例如,如果您想拥有可以在各种物理地址上运行的补丁代码。

于 2012-09-15T18:27:46.537 回答