什么是位置相关代码和位置无关代码之间的区别?
还有,我们如何使用示例实现 / 调用自己的静态和动态库?
什么是位置相关代码和位置无关代码之间的区别?
还有,我们如何使用示例实现 / 调用自己的静态和动态库?
位置独立代码可以在内存加载代码的任何位置正确运行。通常使用相对跳转调用函数来实现,相对跳转时,跳转地址是从代码流中的当前位置计算得出的,因此代码可能看起来像:"从当前位置向后跳585个字节"或者"从该模块的基地址开始向后跳5745个字节",而不是"跳转到0x46fae55地址"。同样,对于任何其他引用存储器地址的指令,必须相对于当前代码位置或在运行时相对于确定的基地址写入。
由于内存管理单元(MMU)和虚拟内存地址的使用,使得位置独立代码对可执行文件几乎已经过时了。然而,共享库必须编写为位置独立代码,因为它们可以映射到可执行文件的地址空间中的任何位置。
relocation_table: // list of values to be modified
0022, 0100, ...
.text
0020: xx yy 12 00 mov ax,[0x0012] <-- the "absolute address" 0012 is
// located at address 0022 in the binary -- that has to be added with the real
// location of the the "position-independent" code