スタックカナリアはスレッドを通して共有されますか?

スタックカナリアはスレッドを通して共有されますか?

私が理解したところ、スタックカナリアは次のように動作します。プログラムが起動すると、ランダムな値が生成され、スレッドローカルストア(%fs:0x28)に格納されます。このランダムな値は各関数呼び出し時にスタックにプッシュされるため、後で確認できます。

TLSエリアの「マスタークッキー」に関しては、2つの質問があります。

  1. 一般的なメモリプロセスのレイアウトを考えてみましょう。 ここに画像の説明を入力してください。

このレイアウトでは、スレッドローカルストレージはどこにありますか?

  1. プロセスが新しいスレッドを作成すると、スレッドローカルストア(したがってスタックカナリア値)は新しいスレッドにコピーされますか?それとも、カーネルはスレッドごとに新しいスタックカナリア値を生成しますか?

ベストアンサー1

  1. 新しいスレッドが作成されると、スレッドスタックにメモリ領域が割り当てられます。スレッドローカル変数のためのスペースがこのゾーンから割り当てられます。厳密に言えば、TLS変数はスタックの一部ではありません。つまり、スタックからプッシュもポップもされませんが、スタック上部の同じ領域に存在します。

    この領域がアドレス空間内に位置する位置は、いくつかの要因に依存する。 Create a new thread を使用すると、pthread_createプログラマはスレッドのスタックとして使用するメモリにポインタを渡すことができます。このメモリの位置は、メモリの割り当て方法によって異なります。事前に割り当てられたメモリを使用しない場合は、mmapwith引数NULLを使用してメモリ領域が割り当てられ、addrカーネルはメモリがマップされる場所を決定できます。 x86_64では、このように割り当てられたメモリはスタックとヒープの間にあります。

  2. 各スレッドは新しいカナリア値を使用します。回答を見るこの問題

おすすめ記事