PTRACE_SYSEMU 和 PTRACE_SYSEMU_SINGLESTEP 未在 x64 或 x86 上定义?
PTRACE_SYSEMU, and PTRACE_SYSEMU_SINGLESTEP not defined on x64 or x86?
我的代码如下:
#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. This is repeated for PTRACE_SYSEMU_SINGLESTEP
if the line containing PTRACE_SYSEMU
is commented out. Which the man page states PTRACE_SYSEMU_SINGLESTEP
is only available for x86, except a patch was merged to unify the x86 and x64 处理 PTRACE_SYSEMU_SINGLESTEP
于 2008 年。
这会在 32 位(以及 i686)或 64 位(AMD64)上产生相同的错误。这个发行版是特定的吗?到底是怎么回事?
我可以确认这些值都没有在我的 /usr/include/x86_64/linux/sys/ptrace.h
中定义。但是它们在内核源代码中有定义?!?
在 Ubuntu 16.04(以及 14.04)中,这些在 <asm/ptrace-abi.h>
中定义,它包含在 <asm/ptrace.h>
中,后者又包含在 <linux/ptrace.h>
中,但不是 <sys/ptrace.h>
由于这些请求代码是 linux 特定的(不是任何标准的一部分),如果您需要它们,您需要 #include <linux/ptrace.h>
Sysemu 在用户模式 linux 中用作优化,并在 http://sysemu.sourceforge.net/ 站点进行了描述。它是 UML 的特性(当特殊内核作为普通进程运行时)而不是 ptrace
.
的典型用户
它在 x86 linux 中的实现可以通过 linux 内核 (ptrace_resume
)
的 lxr 中的 TIF_SYSCALL_EMU
标志来检查
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 */
我的代码如下:
#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. This is repeated for PTRACE_SYSEMU_SINGLESTEP
if the line containing PTRACE_SYSEMU
is commented out. Which the man page states PTRACE_SYSEMU_SINGLESTEP
is only available for x86, except a patch was merged to unify the x86 and x64 处理 PTRACE_SYSEMU_SINGLESTEP
于 2008 年。
这会在 32 位(以及 i686)或 64 位(AMD64)上产生相同的错误。这个发行版是特定的吗?到底是怎么回事?
我可以确认这些值都没有在我的 /usr/include/x86_64/linux/sys/ptrace.h
中定义。但是它们在内核源代码中有定义?!?
在 Ubuntu 16.04(以及 14.04)中,这些在 <asm/ptrace-abi.h>
中定义,它包含在 <asm/ptrace.h>
中,后者又包含在 <linux/ptrace.h>
中,但不是 <sys/ptrace.h>
由于这些请求代码是 linux 特定的(不是任何标准的一部分),如果您需要它们,您需要 #include <linux/ptrace.h>
Sysemu 在用户模式 linux 中用作优化,并在 http://sysemu.sourceforge.net/ 站点进行了描述。它是 UML 的特性(当特殊内核作为普通进程运行时)而不是 ptrace
.
它在 x86 linux 中的实现可以通过 linux 内核 (ptrace_resume
)
TIF_SYSCALL_EMU
标志来检查
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 */