使代码与位置无关增加了一个抽象层,这需要在运行时针对某些操作(通常与访问具有静态存储的变量有关)执行额外的查找步骤。
所以如果你不需要它,就不要使用它!
在某些特定情况下,您必须生成 PIC(即在创建运行时可加载代码时,例如插件模块或库),但增加的灵活性是有代价的。
血淋淋的细节取决于您的加载器如何工作,无论您是构建可执行文件还是库,但从某种意义上说,这都是构建系统和编译器的问题,而不是您的问题。
如果您确实想了解,则需要考虑在执行开始之前将代码放入地址空间的位置以及芯片提供的分支指令集。分支是相对的还是绝对的?对数据段的访问是相对的还是绝对的?
如果分支是绝对的,则代码必须加载到可靠的地址,否则它将无法工作。这是位置相关的代码。许多简单(或更旧)的操作系统通过始终将程序加载到同一位置来适应这一点。
相对分支意味着可以放置在内存中的任何位置。那是位置无关的代码。
同样,您需要知道的只是在您的平台上调用编译器和链接器的方法。