在x64或x86上未定义PTRACE_SYSEMU和PTRACE_SYSEMU_单步?
我的代码如下:在x64或x86上未定义PTRACE_SYSEMU和PTRACE_SYSEMU_单步?,c,linux,ptrace,C,Linux,Ptrace,我的代码如下: #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("PTRAC
#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;
}
#包括
#包括
int
main()
{
printf(“PTRACE\u CONT:%d\n”,PTRACE\u CONT);
printf(“PTRACE\u系统调用:%d\n”,PTRACE\u系统调用);
printf(“PTRACE_SINGLESTEP:%d\n”,PTRACE_SINGLESTEP);
printf(“PTRACE\u SYSEMU:%d\n”,PTRACE\u SYSEMU);
printf(“PTRACE\u SYSEMU\u SINGLESTEP:%d\n”,PTRACE\u SYSEMU\u SINGLESTEP);
printf(“PTRACE\u-LISTEN:%d\n”,PTRACE\u-LISTEN);
返回0;
}
我正在使用Ubuntu16.04(Linux x86_64 4.40-38)上的默认标志编译gcc v5.4.0
这会引发一个未声明的错误PTRACE\u SYSEMU
。而man ptrace
页面。如果包含PTRACE\u SYSEMU
的行被注释掉,则对PTRACE\u SYSEMU\u SINGLESTEP
重复此操作。手册页中指出的PTRACE\u SYSEMU\u SINGLESTEP
仅适用于x86,在2008年处理PTRACE\u SYSEMU\u SINGLESTEP
这会在32位(井i686)或64位(AMD64)上产生相同的错误。这个发行版是特定的吗?发生了什么事
我无法确认这两个值都未在我的/usr/include/x86\u 64/linux/sys/ptrace.h
中定义。但是它们是在内核源代码中定义的 在Ubuntu 16.04(以及14.04)上,这些都是在
中定义的,它包含在
中,而
又包含在
中,但不包含在
由于这些请求代码是特定于linux的(不是任何标准的一部分),如果您需要它们,您需要
#包括Sysemu在用户模式linux中作为优化使用,并在现场进行描述。它是UML的特性(当特殊内核作为普通进程运行时),而不是ptrace
的典型用户
它在x86Linux中的实现可以通过linux内核lxr中的TIF\u SYSCALL\u EMU
标志来检查(ptrace\u resume
)
唯一的定义是针对x86:
非常感谢。我发誓,在我的测试中,我一定是拼错了一个变量,然后在画牦牛棚时跑掉了。在2015年,为ARM实现这一点的补丁非常简单:
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
85 #define TIF_SYSCALL_EMU 6 /* syscall emulation active */