7
#include <stdint.h>
uint64_t rip;
int main()
{
    asm(
        "movq %%rip, %0\n" : "=m" (rip)
        );

    sleep(10);
}

当我编译时,我得到

cc -m64    rip.c   -o rip
/tmp/ccwNbZi1.s: Assembler messages:
/tmp/ccwNbZi1.s:12: Error: suffix or operands invalid for `movq'
make: *** [rip] Error 1
4

2 回答 2

19

您无法阅读(E|R)IP,因为没有 x86(/64) 指令可以直接阅读。

CALL“阅读”它的唯一方法是使用该指令进行调用。它会将返回地址保存在堆栈中,并且您可以读取该地址。

更新:在 64 位模式下,您可以利用RIP-relative 寻址,因此LEA RAX, [RIP]将在RAX. 另一种解决方法是MOV RAX, $在组装中。

于 2012-09-12T23:57:36.670 回答
-1

我能想到的在 x86_64 下获取/设置 %rip 的唯一方法是使用 ptrace()。以下是从 ltrace 的源代码复制而来的。

void* addr = ptrace(PTRACE_PEEKUSER, pid, (8 * RIP), 0);
ptrace(PTRACE_POKEUSER, pid, (8 * RIP), addr);

其中 RIP 是在 /usr/include/sys/reg.h 中定义的宏

于 2018-02-22T08:14:47.697 回答