リンカーとライブラリ

プログラムの起動

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

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

tlssizem+1 は動的オブジェクト m の割り当てテンプレートのサイズで、alignm+1 は整列です (1 <= m <= MM は読み込まれる動的オブジェクトの合計数)。 round(offset, align) 関数は、align の次の倍数に丸められたオフセットを返します。TLS テンプレートは、スレッドポインタ tpt の直前に配置されます。TLS データに対するアクセスは、tpt からの減算にもとづいて行われます。

次に、実行時リンカーは起動時の TLS 割り当てサイズの合計 tlssizeS を計算します。これは、tlsoffsetM に等しくなります。

続いて実行時リンカーは、初期化レコードのリンクリストを作成します。このリスト内の各レコードは、読み込まれた動的オブジェクトごとにその TLS 初期化イメージを記述するものであり、以下のフィールドを含みます。

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