スレッド ローカル ストレージに関するUlrich Drepper の論文では、いくつかの異なる CPU アーキテクチャの TLS ABI の概要が説明されていますが、次の 2 つの理由から、TLS を実装するための基礎としては不十分であることがわかりました。
- ARM、MIPS などの多くの重要なアーキテクチャが省略されています (一方で、Itanium のような完全に無関係なものが多数含まれています)。
- さらに重要なことは、多くの実装の詳細が ABI と混在しているため、相互運用性に必要なプロパティと、彼の実装の単なる側面を区別するのが難しいことです。
例として、i386 の実際の ABI 要件は次のとおりです。
%gs:0
自分自身へのポインタを指します。- メイン実行可能ファイルの TLS セグメントがある場合は、このアドレスからの固定 (リンカーによる負の) オフセットに配置する必要があります。
- 最初にロードされたライブラリの他のすべての TLS セグメントには、このアドレスに関連する実行時定数 (つまり、各スレッドで同じですが、異なるプログラム実行間で必ずしも同じであるとは限りません) のオフセットが必要です (また、動的リンカーは、再配置をこれらのオフセット)。
___tls_get_addr
__tls_get_addr
関数は、任意の TLS セグメントを検索するための正しいセマンティクスで存在する必要があります。
特に、DTV の存在またはレイアウトは ABI の一部ではなく、メイン プログラム以外の TLS セグメントの順序付け/レイアウトでもありません。
「TLSバリアントII」を使用するアーキテクチャには、おおよそ上記のABI要件があるようです。しかし、「TLSバリアントI」の要件をまったくよく理解していません。ソース(uClibcおよびglibcの)を読むと、「バリアントI」にはいくつかのバリアントが存在する可能性があるようです。
私が見るべきより良いドキュメントはありますか、またはTLSの仕組みに詳しい人がABI要件を説明してくれますか?