我已经写在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是一个如何使用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top