与位置无关的代码(PIC)的处理是什么?

时间:2012-09-15 18:14:45

标签: c compilation

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

血腥的细节取决于你的加载器如何处理你是在构建可执行文件还是库,但是有一种感觉,这对于构建系统和编译器来说都是一个问题,而不是你。

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

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

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


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

答案 2 :(得分:1)

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

相关问题