コンパイル時に割り当てられるスレッド固有データのコピーは、実行される個々のスレッドに、個別に関連付けられる必要があります。このデータを提供するために、TLS セクションを使用してサイズと初期の内容を指定します。
コンパイル環境は、SHF_TLS フラグで識別されるセクション内に TLS を割り当てます。これらのセクションは、領域がどのように宣言されているかにもとづき、初期化された TLS と初期化されていない TLS を提供します。
初期化されたスレッド固有変数は、.tdata セクション内または .tdata1 セクション内に割り当てます。この初期化は再配置を必要とする場合があります。
初期化されていないスレッド固有変数は、COMMON シンボルとして定義します。その結果の割り当ては、.tbss セクション内で行われます。
初期化されていないセクションは、適切な整列になるようにパッドを入れられて、初期化されたセクションの直後に割り当てられます。結合されたこれらのセクションは、新しいスレッドの作成時に 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 テンプレートの整列 |