リンカーとライブラリ

スレッド固有領域 (TLS) セクション

コンパイル時に割り当てられるスレッド固有データのコピーは、実行される個々のスレッドに、個別に関連付けられる必要があります。このデータを提供するために、TLS セクションを使用してサイズと初期の内容を指定します。

コンパイル環境は、SHF_TLS フラグで識別されるセクション内に TLS を割り当てます。これらのセクションは、領域がどのように宣言されているかにもとづき、初期化された TLS と初期化されていない TLS を提供します。

初期化されていないセクションは、適切な整列になるようにパッドを入れられて、初期化されたセクションの直後に割り当てられます。結合されたこれらのセクションは、新しいスレッドの作成時に TLS の割り当てに使用できる TLS テンプレートとなります。

このテンプレートの初期化された部分を、TLS 初期化イメージと呼びます。初期化されたスレッド固有変数の結果として発生する再配置はすべて、このテンプレートに適用されます。その後、新しいスレッドが初期値を要求すると、再配置された値が使用されます。

TLS シンボルのシンボルタイプは STT_TLS です。これらのシンボルには、TLS テンプレートの先頭からの相対オフセットが割り当てられます。これらのシンボルに関連付けられた実際の仮想アドレスとは無関係です。このアドレスが指すのはテンプレートだけで、各データ項目のスレッドごとのコピーではありません。

動的実行可能ファイルと共有オブジェクトでは、STT_TLS シンボルの st_value フィールドに、定義済みシンボルの場合は割り当てられたオフセットが、未定義シンボルの場合はゼロが含まれます。

TLS へのアクセスをサポートするために、再配置がいくつか定義されます。SPARC: スレッド固有領域の再配置のタイプx86: スレッド固有領域の再配置のタイプを参照してください。タイプ STT_TLS のシンボルは、TLS 再配置によってのみ参照されます。TLS 再配置は、タイプ STT_TLS のシンボルだけを参照します。

動的実行可能ファイルと共有オブジェクトでは、PT_TLS プログラムエントリは TLS テンプレートの説明に使用され、以下の構成要素を持っています。

表 8–1 ELF PT_TLS プログラムヘッダーエントリ

構成要素 

値 

p_offset

TLS 初期化イメージのファイルオフセット

p_vaddr

TLS 初期化イメージの仮想メモリーアドレス

p_paddr

予約済み 

p_filesz

TLS 初期化イメージのサイズ

p_memsz

TLS テンプレートの合計サイズ

p_flags

PF_R

p_align

TLS テンプレートの整列