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
文字で示されます。L
B
ここで何が問題なのですか?
これはnm
問題ですか、それとも本当の問題ですか?