c-在ret指令之后的lea指令是什么意思



我在使用clang和gcc生成的可执行文件中找到了x86 lea指令。lea指令在ret指令之后,如下所示。

 0x???????? <func>
   ...
   pop %ebx
   pop %ebp
   ret
   lea 0x0(%esi,%eiz,1),%esi
   lea 0x0(%edi,%eiz,1),%edi
 0x???????? <next_func>
   ...

这些lea指令用于什么?lea指令中没有jmp指令。

我的环境是Ubuntu 12.04 32位和gcc 4.6.3。

这可能不是什么——它只是填充,让下一个函数在一个可能是至少8(很可能是16)的倍数的地址开始。

根据代码的其余部分,它可能实际上是一个表。例如,switch语句的一些实现使用了一个常数值表,该常数值表通常存储在代码段中(尽管严格来说,它更像是数据而不是代码)。

不过,第一种可能性要大得多。顺便说一句,这样的空间通常用0x03填充。这是一条单字节调试中断指令,因此,如果某些未定义的行为导致尝试执行该代码,它会立即停止执行并中断到调试器(如果可用)。

最新更新