在这个例子中,信号pt的目的是什么

时间:2017-03-29 12:14:38

标签: gcc assembly gdb

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

1 个答案:

答案 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

将值0x4012a00x2放入寄存器ESI和EDI中。通过ABI,这是参数传递给函数的方式。

callq  400b90 <signal@plt>

通过PLT调用函数signal。 PLT与动态链接器有关,因为我们无法确定signal函数在内存中的最终位置。基本上,这只是找到最终的内存位置并调用signal

add    $0x8,%rsp
retq

从之前撤消sub并返回给来电者。