我正在调试linux中的崩溃,并正在进行函数cxa_finalize
的汇编崩溃发生在看似无法访问的源代码行中:
cmp %edx,%esi // f >= &funcs->fns[0]
jae 0xb6e17b88 // enter for loop
jmp 0xb6e17c08 // exit for loop
lea 0x0(%esi,%eiz,1),%esi // crashes here - how do we even get here since there is a
// jmp above us, and nothing jumps to here
cmp %edi,0xc(%esi) // d == f->func.cxa.dso_handle (jumped to from below)
稍后在此方法中,在lea 0x0(%esi,%eiz,1),%esi
和jmp
之后还会显示另一条nop
指令,该指令也显示无法访问。在这种情况下,jmp
也会退出for循环。
这里是否存在一些无法接入指令的范例?
编辑:原来它并没有在lea
指令上崩溃,而是在cmp
之后的esi
指令处,在onBlur
访问内存时崩溃。
答案 0 :(得分:4)
我找到了答案here
有时GCC会在代码流中插入NOP指令,以确保正确对齐和类似的东西。 NOP指令占用一个字节,因此您可以认为可以根据需要添加任意数量的字节。但根据Ian Lance Taylor的说法,芯片执行一条长指令要比许多短指令快。因此,它们不是插入七条NOP指令,而是使用一个奇怪的LEA,它占用了7个字节,在语义上等同于NOP