【问题标题】:PTRACE_SYSEMU, and PTRACE_SYSEMU_SINGLESTEP not defined on x64 or x86?PTRACE_SYSEMU 和 PTRACE_SYSEMU_SINGLESTEP 未在 x64 或 x86 上定义?
【发布时间】:2016-10-05 13:34:34
【问题描述】:

我的代码如下:

#include <sys/ptrace.h>
#include <stdio.h>

int
main()
{
    printf("PTRACE_CONT: %d\n", PTRACE_CONT);
    printf("PTRACE_SYSCALL: %d\n", PTRACE_SYSCALL);
    printf("PTRACE_SINGLESTEP: %d\n", PTRACE_SINGLESTEP);
    printf("PTRACE_SYSEMU: %d\n", PTRACE_SYSEMU);
    printf("PTRACE_SYSEMU_SINGLESTEP: %d\n", PTRACE_SYSEMU_SINGLESTEP);
    printf("PTRACE_LISTEN: %d\n", PTRACE_LISTEN);
    return 0;
}

我在 Ubuntu16.04 (Linux x86_64 4.40-38) 上使用 gcc v5.4.0 上的默认标志进行编译。

这会引发 PTRACE_SYSEMU 未声明的错误。而man ptrace 页面states it exists。如果包含 PTRACE_SYSEMU 的行被注释掉,则对 PTRACE_SYSEMU_SINGLESTEP 重复此操作。手册页指出 PTRACE_SYSEMU_SINGLESTEP 仅适用于 x86,except a patch was merged to unify the x86 and x64 在 2008 年处理 PTRACE_SYSEMU_SINGLESTEP

这会在 32 位(以及 i686)或 64 位(AMD64)上产生相同的错误。这个发行版是特定的吗?到底是怎么回事?

我可以确认我的/usr/include/x86_64/linux/sys/ptrace.h 中没有定义这些值。但是它们是在内核源代码中定义的?!?

【问题讨论】:

    标签: c linux ptrace


    【解决方案1】:

    在 Ubuntu 16.04(以及 14.04)上,这些定义在 &lt;asm/ptrace-abi.h&gt; 中,包含在 &lt;asm/ptrace.h&gt; 中,而 &lt;linux/ptrace.h&gt; 又包含在 &lt;sys/ptrace.h&gt; 中,但不包含在 &lt;sys/ptrace.h&gt;

    由于这些请求代码是 linux 特定的(不是任何标准的一部分),如果你想要它们,你需要#include &lt;linux/ptrace.h&gt;

    【讨论】:

    • 谢谢。我发誓在我的测试中我尝试了 我一定是拼错了一个变量并跑掉了画牦牛棚。
    【解决方案2】:

    Sysemu 在用户模式 ​​linux 中用作优化,并在http://sysemu.sourceforge.net/ 网站上进行了描述。它是 UML 的特性(当特殊内核作为普通进程运行时)而不是 ptrace 的典型用户。

    它在x86 linux中的实现可以通过linux内核lxr中的TIF_SYSCALL_EMU标志来检查(ptrace_resume

    http://lxr.free-electrons.com/source/kernel/ptrace.c?v=4.10#L767

    767 static int ptrace_resume(struct task_struct *child, long request,
    768                          unsigned long data)
       ...
    780 #ifdef TIF_SYSCALL_EMU
    781         if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP)
    782                 set_tsk_thread_flag(child, TIF_SYSCALL_EMU);
    783         else
    784                 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
    785 #endif
    

    http://lxr.free-electrons.com/ident?i=TIF_SYSCALL_EMU

    唯一的定义是针对 x86 的:

    http://lxr.free-electrons.com/source/arch/x86/include/asm/thread_info.h?v=4.10#L85

     85 #define TIF_SYSCALL_EMU         6       /* syscall emulation active */
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多