Boost C++ ライブラリの最新の SVN バージョンがインストールされた Ubuntu 13.04 システムを使用しています。Boost インストールは、システムのネイティブgcc
バージョンである v4.7.3 を使用して構築されました。私は Boost をかなり広範囲に使用していgcc
ます。Boost.Thread (以下で詳しく説明します) を含め、それらの多くを問題なく使用しました。
インストールされている Boost ライブラリとリンクする Intel C++ コンパイラ (v13.x シリーズでいくつかの異なるバージョンを個人的に使用しました) を使用してプログラムをビルドしようとすると、問題が発生します。そうすると、プログラムの起動直後にセグメンテーション違反が発生します。Boost.Thread ライブラリの静的初期化中に発生するようです。簡単なプログラム例を次に示します。
#include <boost/version.hpp>
#include <boost/thread.hpp>
int main()
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
Intel C++ を使用してコンパイルします。
icpc test.cc -lboost_thread -lboost_system -I/path/to/boost/inc/dir -L/path/to/boost/lib/dir
前述したように、結果のプログラムを実行すると、ほぼ即時にセグメンテーション違反が発生します。経由gdb
で、segfault の時点からのスタック トレースは次のようになります。
#0 0x00007ffff79b6351 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>() () from ./libboost_thread.so.1.55.0
#1 0x00007ffff79b02e1 in _GLOBAL__sub_I_thread.cpp () from ./libboost_thread.so.1.55.0
#2 0x00007ffff7de9876 in call_init (l=l@entry=0x7ffff7ff9a10, argc=argc@entry=1,
argv=argv@entry=0x7fffffffe0b8, env=env@entry=0x7fffffffe0c8) at dl-init.c:84
#3 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>,
argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55
#4 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8)
at dl-init.c:133
#5 0x00007ffff7ddb68a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#6 0x0000000000000001 in ?? ()
#7 0x00007fffffffe391 in ?? ()
#8 0x0000000000000000 in ?? ()
あまり啓発的ではありませんが、の初期化中に明らかに死んでいますlibboost_thread.so
。デバッグ シンボルを含めて Boost を再構築すると、少し良くなった画像が得られます。
#0 shared_count (r=..., this=0x7ffff7bbc5f8 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep+8>)
at ./boost/smart_ptr/shared_ptr.hpp:328
#1 shared_ptr (this=0x7ffff7bbc5f0 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep>) at ./boost/smart_ptr/shared_ptr.hpp:328
#2 exception_ptr (ptr=..., this=0x7ffff7bbc5f0 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep>)
at ./boost/exception/detail/exception_ptr.hpp:53
#3 boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_> () at ./boost/exception/detail/exception_ptr.hpp:130
#4 0x00007ffff79b02e1 in __static_initialization_and_destruction_0 (__initialize_p=<optimized out>, __priority=<optimized out>) at ./boost/exception/detail/exception_ptr.hpp:143
#5 _GLOBAL__sub_I_thread.cpp(void) () at libs/thread/src/pthread/thread.cpp:767
#6 0x00007ffff7de9876 in call_init (l=l@entry=0x7ffff7ff9a10, argc=argc@entry=1, argv=argv@entry=0x7fffffffe0b8, env=env@entry=0x7fffffffe0c8) at dl-init.c:84
#7 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55
#8 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8) at dl-init.c:133
#9 0x00007ffff7ddb68a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#10 0x0000000000000001 in ?? ()
#11 0x00007fffffffe391 in ?? ()
#12 0x0000000000000000 in ?? ()
問題の原因となっている静的/グローバル オブジェクトが不明であるため、どうすればよいかわかりません。v13.x シリーズのいくつかの Boost バージョンといくつかの異なるバージョンのインテル C++ コンパイラーを使用して、この動作を再現しました。これは、現時点でアクセスできる唯一のリリースです。私はすべてのコンパイラ順列を試しました (つまり、Boost を両方gcc
でicpc
ビルドし、テスト アプリケーションも両方でビルドしました)。失敗する唯一の順列は、Boost がビルドされgcc
、テスト アプリケーションが を使用してビルドされている場所icpc
です。それ以外の場合、テスト アプリケーションは正常に実行されます。
そうは言っても、あなたは明白な答えに導かれるかもしれません:
- Boostを使用して再構築し
icpc
、それを1日と呼んでみませんか? 私の実験を考えると、そのアプローチは効果的であるように見えますが、icpc
私のソフトウェアを構築するために使用したい顧客がいます。これらの同じ顧客は、Linux ディストリビューションが提供する Boost パッケージをインストールしている可能性があります。それらは、そのパッケージを生成するために使用されたビルド環境を制御することはできません (そして、おそらく、それはgcc
とにかく使用してコンパイルされました)。したがって、このような混合コンパイラ構成をサポートできれば、それが最適です。
この静的な初期化の問題に対処する方法について、誰かに推奨事項はありますか?