Oracle® Solaris 11.2 リンカーとライブラリガイド

印刷ビューの終了

更新: 2014 年 7 月
 
 

プログラムの起動

プログラムの起動時に、実行システムはメインスレッド用の TLS を作成します。

まず実行時リンカーが、読み込まれたすべての動的オブジェクト (動的な実行可能ファイルを含む) の TLS テンプレートを論理的に結合し、単一の静的なテンプレートとしてまとめます。各動的オブジェクトの TLS テンプレートには、結合されたテンプレート内のオフセット tlsoffsetm が次のように割り当てられます。

  • tlsoffset1 = round(tlssize1, align1 )

  • tlsoffsetm+1 = round(tlsoffsetm + tlssizem+1, alignm+1)

tlssizem+1 は動的オブジェクト m の割り当てテンプレートのサイズで、 alignm+1 は整列です。ここで、1 <= m <= M であり、M は読み込まれる動的オブジェクトの合計数です。round(offset, align) 関数は、align の次の倍数に丸められたオフセットを返します。

次に、実行時リンカーは、起動時の TLS に必要な割り当てサイズの tlssizeS を計算します。このサイズは、tlsoffset M512 バイトを加えた値に等しくなります。この加算により、静的な TLS 参照のバックアップ予約が得られます。静的な TLS 参照を作成し、プロセスの初期化後に読み込まれる共有オブジェクトは、このバックアップ予約に割り当てられます。ただし、この予約のサイズは固定および限定されています。また、この予約が対応しているのは、初期化されていない TLS データ項目用のストレージの提供だけです。柔軟性を最大限高めるため、動的な TLS モデルを使用して、共有オブジェクトがスレッドローカル変数を参照するようにしてください。

計算された TLS サイズ tlssizeS に関連付けられる静的な TLS 領域は、スレッドポインタ tpt の直前に配置されます。TLS データに対するアクセスは、tpt からの減算にもとづいて行われます。

静的な TLS 領域は、初期化レコードのリンクリストに関連付けられます。このリスト内の各レコードは、読み込まれた動的オブジェクトごとにその TLS 初期化イメージを記述するものです。各レコードには、次のフィールドが含まれています。

  • TLS 初期化イメージを指すポインタ。

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

  • オブジェクトの tlsoffsetm

  • オブジェクトが静的な TLS モデルを使用するかどうかを示すフラグ。

スレッドライブラリは、この情報を使用して初期スレッドにストレージを割り当てます。このストレージが初期化され、初期スレッド用に動的な TLS ベクトルが作成されます。