我在使用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
指令用于什么? jmp
指令没有lea
条指令。
我的环境是Ubuntu 12.04 32位和gcc 4.6.3。
答案 0 :(得分:3)
它可能不是什么 - 它只是填充让下一个函数从一个可能是至少8的倍数(很可能是16)的地址开始。
根据代码的其余部分,可能它实际上是一个表。例如,switch
语句的某些实现使用通常存储在代码段中的常量表(严格来说,它更像是数据而不是代码)。
第一种情况更有可能。另外,这样的空间通常用0x03填充。这是一个单字节的调试中断指令,因此如果某些未定义的行为导致尝试执行该代码,它会立即停止执行并中断调试器(如果可用)。