コンパイル時に割り当てられたスレッド固有データのコピーは、実行される個々のスレッドに、個別に関連付けられる必要があります。このデータを提供するために、TLS セクションを使用してサイズと初期の内容を指定します。コンパイル環境は、SHF_TLS フラグで識別されるセクション内に TLS を割り当てます。これらのセクションは、領域がどのように宣言されているかにもとづき、初期化された TLS と初期化されていない TLS を提供します。
初期化されたスレッド固有変数は、.tdata セクション内または .tdata1 セクション内に割り当てます。この初期化は再配置を必要とする場合があります。
初期化されていないスレッド固有変数は、COMMON シンボルとして定義します。その結果の割り当ては、.tbss セクション内で行われます。
初期化されていないセクションは、適切な整列になるようにパッドを入れられて、初期化されたセクションの直後に割り当てられます。結合されたこれらのセクションは、新しいスレッドの作成時に TLS の割り当てに使用できる TLS テンプレートとなります。このテンプレートの初期化された部分を、TLS 初期化イメージと呼びます。初期化されたスレッド固有変数の結果として発生する再配置はすべて、このテンプレートに適用されます。その後、新しいスレッドが初期値を要求すると、再配置された値が使用されます。
TLS シンボルのシンボルタイプは STT_TLS です。これらのシンボルには、TLS テンプレートの先頭からの相対オフセットが割り当てられます。これらのシンボルに関連付けられた実際の仮想アドレスとは無関係です。このアドレスが指すのはテンプレートだけで、各データ項目のスレッドごとのコピーではありません。動的実行可能ファイルと共有オブジェクトでは、STT_TLS シンボルの st_value フィールドに、定義済みシンボルの場合は割り当てられた TLS オフセットが含まれます。未定義シンボルの場合は、このフィールドにゼロが含まれます。
TLS へのアクセスをサポートするために、再配置がいくつか定義されます。「SPARC: スレッド固有領域の再配置のタイプ」、「32 ビット x86: スレッド固有領域の再配置のタイプ」、および「x64: スレッド固有領域の再配置のタイプ」を参照してください。TLS 再配置は通常、タイプ STT_TLS のシンボルを参照します。TLS 再配置は、GOT エントリに関連するローカルセクションシンボルも参照できます。この場合、割り当てられた TLS のオフセットが、関連する GOT エントリに保存されます。
動的実行可能ファイルと共有オブジェクトでは、PT_TLS プログラムエントリが TLS テンプレートを記述します。このテンプレートには、次のメンバーが含まれます。
表 8–1 ELF PT_TLS プログラムヘッダーエントリ
メンバー |
値 |
---|---|
p_offset |
TLS 初期化イメージのファイルオフセット |
p_vaddr |
TLS 初期化イメージの仮想メモリーアドレス |
p_paddr |
0 |
p_filesz |
TLS 初期化イメージのサイズ |
p_memsz |
TLS テンプレートの合計サイズ |
p_flags |
PF_R |
p_align |
TLS テンプレートの整列 |