3

i686/32 ビット アーキテクチャの Ubuntu 14.04 コンピューターで、(バージョン 4.8.2) を使用してスレッド ローカル ストレージ(TLS) クラスを初めて使用し、テストしています。gcc

__threadキーワードが目的の効果を持っているかどうかを調べるために、この最小限のテスト プログラムをgcc test.c(エラーや警告なしで)コンパイルします。

#include <stdio.h>

__thread int i;

int main() {
  i = 7;
  printf("%d\n",i);
}

ツールを使用して、オブジェクト コード内nmのシンボルのストレージ クラスを確認します。i

nm a.out | grep ' i'

結果は

00000000 B i

これはi、共通のグローバルな初期化されていない変数 (BSS セクションに格納されている) として扱われることを意味します。によると、スレッド ローカル ストレージ変数はではなくman nm文字で示されます。LB

ここで何が問題なのですか?

これはnm問題ですか、それとも本当の問題ですか?

4

2 に答える 2

5

問題はありませんnm(1)。出力を書き込む方法です。

nm(1)のデフォルトの出力形式 (および情報) は、プラットフォームによって異なります (たとえば、私の Linux デスクトップのマンページでは、スレッドローカル ストレージnm(1)については言及されていません)。L

ただし、 で SysV 出力形式を有効にすると-fs、より詳細な出力が得られます。

$ nm -fs a.out
Symbols from a.out:

Name                  Value           Class        Type         Size             Line  Section

...

i                   |0000000000000000|   B  |               TLS|0000000000000004|     |.tbss
...

ご覧のとおり、この出力形式を使用するとi、列の下にスレッド ローカルであると識別されType.tbss.

ディストリビューションのマンページにLスレッド ローカル ストレージのフラグが記載されていて、それがデフォルトの出力形式で表示されない場合は、.NET のバグだと思いますnm(1)

于 2015-09-05T17:42:40.483 に答える