Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

スレッド固有ストレージ (TLS) セクション

コンパイル時に割り当てられたスレッド固有データのコピーは、実行される個々のスレッドに、個別に関連付けられる必要があります。このデータを提供するために、TLS セクションを使用してサイズと初期の内容を指定します。 コンパイル環境は、SHF_TLS フラグで識別されるセクション内に TLS を割り当てます。これらのセクションは、ストレージがどのように宣言されているかにもとづき、初期化された TLS と初期化されていない TLS を提供します。

  • 初期化されたスレッド固有変数は、.tdata セクション内または .tdata1 セクション内に割り当てます。この初期化は再配置を必要とする場合があります。

  • 初期化されていないスレッド固有変数は、COMMON シンボルとして定義します。その結果の割り当ては、.tbss セクション内で行われます。

初期化されていないセクションは、適切な整列になるようにパッドを入れられて、初期化されたセクションの直後に割り当てられます。結合されたこれらのセクションは、新しいスレッドの作成時に TLS の割り当てに使用できる TLS テンプレートとなります。このテンプレートの初期化された部分を、TLS 初期化イメージと呼びます。初期化されたスレッド固有変数の結果として発生する再配置はすべて、このテンプレートに適用されます。その後、新しいスレッドが初期値を要求すると、再配置された値が使用されます。

TLS シンボルのシンボルタイプは STT_TLS です。これらのシンボルには、TLS テンプレートの先頭からの相対オフセットが割り当てられます。これらのシンボルに関連付けられた実際の仮想アドレスとは無関係です。このアドレスが指すのはテンプレートだけで、各データ項目のスレッドごとのコピーではありません。動的実行可能ファイルと共有オブジェクトでは、STT_TLS シンボルの st_value フィールドに、定義済みシンボルの場合は割り当てられた TLS オフセットが含まれます。未定義シンボルの場合は、このフィールドにゼロが含まれます。

TLS へのアクセスをサポートするために、再配置がいくつか定義されます。スレッド固有ストレージの再配置のタイプスレッド固有ストレージの再配置のタイプ、およびスレッド固有ストレージの再配置のタイプを参照してください。TLS 再配置は通常、タイプ STT_TLS のシンボルを参照します。TLS 再配置は、GOT エントリに関連するローカルセクションシンボルも参照できます。この場合、割り当てられた TLS のオフセットが、関連する GOT エントリに保存されます。

静的 TLS 項目に対する再配置の場合、再配置アドレスは、静的 TLS テンプレートの最後からの負のオフセットとしてエンコードされます。このオフセットの計算は、最初に、32 ビットオブジェクトの場合はもっとも近い 8 バイト境界に、64 ビットオブジェクトの場合はもっとも近い 16 バイト境界にテンプレートサイズを丸めます。この丸めによって、静的な TLS テンプレートがどのような利用にも適切に配置されることが保証されます。

動的実行可能ファイルと共有オブジェクトでは、PT_TLS プログラムエントリが TLS テンプレートを記述します。このテンプレートには、次のメンバーが含まれます。

表 60  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 テンプレートの整列