什么是PIC寄存器(%EBX)呢?
-
09-09-2019 - |
题
我已经写在C“危险”程序++跳转从一个堆栈帧来回到另一个。我们的目标是成为从调用堆栈到呼叫者的最低水平跳跃,做一些事情,然后跳回再下来,每次跳跃其间所有的呼叫。
我通过手动改变堆栈基地址(设定%ebp
)和跳跃到一个标签地址做到这一点。它完全工作,用gcc和ICC两者没有任何堆栈损坏的。此工作的天是一个凉爽天。
现在我采取同样的程序,并用C重写它,这是行不通的。具体来说,它不与GCC V4.0.1(Mac OS)中工作。一旦予跳跃到新的堆栈帧(具有正确设置堆栈基指针)时,下面的说明执行,作为一个呼叫到fprintf
之前。此处列出的最后一条指令死机,解除引用NULL:
lea 0x18b8(%ebx), %eax
mov (%eax), %eax
mov (%eax), %eax
我已经做了一些调试,我已经计算出,通过手动设置%ebx
寄存器当我切换堆栈帧(使用我离开功能在第一位置之前观察到的值),我修复错误。我读过,该寄存器与GCC“位置无关代码”的交易。
什么是与位置无关的代码?如何位置无关代码的工作?什么是该寄存器指向?的
解决方案
PIC是它被加载时被动态地重新定位代码。即非PIC代码设置为链接时跳转和调用地址。 PIC具有引用其中这样的值存在的所有地方,很像一个.dll的表。
当图像被加载时,加载程序将动态地更新这些值。其他方案引用定义了“基础”,目标地址是通过在基底上执行计算决定的数据值。基座通常是通过再次加载程序设置。
最后,其他方案使用调用已知相对偏移各种蹦床。相对偏移包含由装载机更新的代码和/或数据。
有为什么不同的方案被选择不同的原因。运行时,有些是快,但速度慢加载。有些是快速加载,却减少了运行时性能。
其他提示
EBX
指向全局偏移表。请参见此有关PIC上参考I386 。链接解释PIC是什么EBX
是一个如何使用的。
不隶属于 StackOverflow