当我通过传递 0 作为 stack_start 来调用克隆系统调用时会发生什么?根据克隆上的手册页,它应该返回-EINVAL
,但是当我这样做时,它显示SIGSEGV (11)
错误。
clone(func,NULL,0,args);
应该返回-EINVAL,但它失败了SIGSEGV
当我通过传递 0 作为 stack_start 来调用克隆系统调用时会发生什么?根据克隆上的手册页,它应该返回-EINVAL
,但是当我这样做时,它显示SIGSEGV (11)
错误。
clone(func,NULL,0,args);
应该返回-EINVAL,但它失败了SIGSEGV
根据linux内核有这样一个调用链:
sys_clone(...stack_start...) ->do_fork
do_fork(...stack_start...) ->copy_process
复制进程(...stack_start...) ->copy_thread
X86_32 上的 copy_thread(...stack_start...) 或 X86_64 上的copy_thread (...stack_start...)
查看copy_thread
导致我假设由于此函数不检查stack_start
正确性(代码中的 sp 参数),因此在克隆后我们有一个具有无效堆栈指针的任务,并且在零地址处的第一个引用导致SIGSEGV
.
我建议你也看看克隆函数的 glibc 包装器。