2013-02-15 19 views
10

私はdlopen()を使用して追加のモジュールをロードするアプリケーションを持っています。アプリケーションとモジュールは、gcc 4.6を使ってUbuntu 12.04 x86_64上に構築されますが、i386 arch用に構築されています。バイナリは、まったく同じOSを持つ別のマシンにコピーされ、うまく動作します。静的TLSでもうオブジェクトを読み込めません

彼らはUbuntuの12.04のi386にコピーされている場合は、その後、いくつかの(すべてではない)モジュールは、次のメッセージを読み込みに失敗:私はこれは__thread変数の利用によって生じていると思われるでしょう

dlopen: cannot load any more object with static TLS 

。しかし、このような変数は、ロードされたモジュールでは使用されません。

誰かが追加情報を提供できますか?その理由は何ですか?

私は__thread変数の数を減らし、(-ftls-modelなどで)それらを最適化しています、私はそれがほとんど同一システム上で動作しない理由だけで好奇心が強いです。

+0

関連:http://stackoverflow.com/questions/13650740/dlopen-cannot-load-any-more-object-with-static-tls – Wok

答えて

11

これは、__thread変数の使用が原因であると考えられます。

正しい。

ただし、このような変数は、ロードされたモジュールでは使用されません。ローダーモジュール自体でのみ使用されます。

間違っています。自分で__threadを使用していないかもしれませんが、モジュールに静的にリンクしているライブラリは、それらを使用してです。理由ができるか

readelf -l /path/to/foo.so | grep TLS 

:あなたはでこれを確認することができますか?

モジュールは-ftls-model=initial-execを使用していますが、-ftls-model=global-dynamicを使用してください。これは、foo.soにリンクされているコードの一部(一部)が-fPICなしで構築されている場合に最もよく発生します。

-fPICコードを共有ライブラリにリンクすることは、x86_64では不可能ですが、ix86で許可されています(これは、このような多くの微妙な問題につながります)。

更新:

私は-fPICなしでコンパイル1つのモジュールを持っていますが、私は私の知る限り、デフォルトの値が初期-execの

ではありません覚えているように、全くTLSモデルを設定していません
  • ELFイメージ(実行可能ライブラリまたは共有ライブラリ)ごとに1つのtlsモデルしか存在できませんでした。
  • initial-execのTLSモデルのデフォルト値は、-fPICコードです。あなたがfoo.so__threadを使用しても、一つの非-fPICオブジェクトをリンクする場合は、foo.soためinitial-execそのTLSのすべてを取得していること。次の

なぜそれが問題を引き起こすのですか?なぜなら、initial-execが使用されると、tls変数の数は(ダイナミックに割り当てられていないため)制限されるからです。

正しい。

+0

私は完全に理解していません。私は1つのモジュールを-fPICなしでコンパイルしましたが(パフォーマンスを実験していました)、tls-modelは設定しません。デフォルト値はinitial-execではないことを覚えていますか?それでなぜそれが問題を引き起こすのですか?なぜなら、initial-execが使用されると、tls変数の数は(ダイナミックに割り当てられないので)制限されるからです。私はすでにいくつかのモジュールで使用されている.hヘッダーに含まれていた__thread変数の数を減らして問題を解決しましたが、エラーはなくなりましたが、私はまだ不思議です。 – queen3

+1

@ queen3私は答えを更新しました。 –

+0

@EmployedRussian 'readelf -l' - >' readelf --dynamic'? –

関連する問題