我在使用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填充。这是一条单字节调试中断指令,因此,如果某些未定义的行为导致尝试执行该代码,它会立即停止执行并中断到调试器(如果可用)。