callq 400b90 <signal@plt>
做了什么?
它在C中的外观如何?
4013a2: 48 83 ec 08 sub $0x8,%rsp
4013a6: be a0 12 40 00 mov $0x4012a0,%esi
4013ab: bf 02 00 00 00 mov $0x2,%edi
4013b0: e8 db f7 ff ff callq 400b90 <signal@plt>
4013b5: 48 83 c4 08 add $0x8,%rsp
4013b9: c3 retq
答案 0 :(得分:2)
callq 400b90&lt; signal @ plt&gt;办?
通过PLT(过程链接表)调用信号功能。因此更具技术性:它将当前指令指针推送到堆栈并跳转到signal@plt
。
它在C中的外观如何?
void* foo(void) {
return signal(2, (void *) 0x4012a0);
}
让我们逐行查看您的代码:
sub $0x8,%rsp
这保留了一些堆栈空间。您可以忽略它(堆栈空间未使用)。
mov $0x4012a0,%esi
mov $0x2,%edi
将值0x4012a0
和0x2
放入寄存器ESI和EDI中。通过ABI,这是参数传递给函数的方式。
callq 400b90 <signal@plt>
通过PLT调用函数signal
。 PLT与动态链接器有关,因为我们无法确定signal
函数在内存中的最终位置。基本上,这只是找到最终的内存位置并调用signal
。
add $0x8,%rsp
retq
从之前撤消sub
并返回给来电者。