我已阅读GCC 的代码生成约定选项,但无法理解“生成与位置无关的代码 (PIC)”的作用。请举一个例子来解释我是什么意思。
位置无关代码意味着生成的机器代码不依赖于位于特定地址才能工作。
例如,跳跃将产生为相对而非绝对。
伪组装:
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 编译的,则它适合包含在库中 - 库必须能够从其在内存中的首选位置重定位到另一个地址,在您的库喜欢的地址处可能有另一个已加载的库。