6

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 を両方gccicpcビルドし、テスト アプリケーションも両方でビルドしました)。失敗する唯一の順列は、Boost がビルドされgcc、テスト アプリケーションが を使用してビルドされている場所icpcです。それ以外の場合、テスト アプリケーションは正常に実行されます。

そうは言っても、あなたは明白な答えに導かれるかもしれません:

  • Boostを使用して再構築しicpc、それを1日と呼んでみませんか? 私の実験を考えると、そのアプローチは効果的であるように見えますが、icpc私のソフトウェアを構築するために使用したい顧客がいます。これらの同じ顧客は、Linux ディストリビューションが提供する Boost パッケージをインストールしている可能性があります。それらは、そのパッケージを生成するために使用されたビルド環境を制御することはできません (そして、おそらく、それはgccとにかく使用してコンパイルされました)。したがって、このような混合コンパイラ構成をサポートできれば、それが最適です。

この静的な初期化の問題に対処する方法について、誰かに推奨事項はありますか?

4

1 に答える 1

4

これはロング ショットですが... Boost ライブラリのビルドに使用したものとは異なる が にある場合は、g++それPATHを取り除くか、 に渡し-gxx-name /usr/bin/g++ますicpc。(Intel コンパイラは、使用していると思われる GCC のバージョンに適応します。-gxx-name問題を強制できます。)

OK、おそらく役に立たなかったでしょう。

Ubuntu 13.04 は、Intel Composer XE 2013 SP1 (別名) より前ではサポートされていません。コンパイラ バージョン 14.0.0。リリース ノートの「システム要件」セクションを参照して、最新の 13.x リリースの同じセクションと比較してください。

Intel は間違いなく GCC とのリンクの互換性を目指しています。サポートされているバージョンの Linux のクリーン インストールでこの問題を再現できる場合は、サポート チケットを送信して修正してもらうことができます。

于 2013-09-21T01:37:52.307 に答える