2

stack_start として 0 を渡して clone システム コールを呼び出すとどうなりますか? clone のマニュアルページによると、 を返すはず-EINVALですが、そうするとSIGSEGV (11)エラーが表示されます。

clone(func,NULL,0,args);

-EINVALを返す必要がありますが、失敗しますSIGSEGV

4

1 に答える 1

1

Linuxカーネルによると、そのようなコールチェーンがあります。

sys_clone(... stack_start ...) ->do_fork

do_fork(... stack_start ...) ->copy_process

copy_process(... stack_start ...) ->copy_thread

X86_32の場合はcopy_thread... stack_start ...)、X86_64の場合はcopy_thread(... stack_start ...)

copy_threadこの関数は正確性(コードのsp引数)をチェックしないstack_startため、クローン作成後、無効なスタックポインターを持つタスクがあり、ゼロアドレスでの最初の参照はにつながるという仮定につながりSIGSEGVます。

クローン関数のglibcラッパーも確認することをお勧めします。

于 2012-10-12T11:19:45.977 に答える