プログラムをコンパイルしようとすると、__dso_handle
が見つからないと文句を言う未解決のシンボルエラーが発生します。この関数は通常どのライブラリで定義されていますか?
次のnm on libstdc++.so.6
の結果は、それが含まれていることを意味しますか?
リンクしようとしましたが、それでもエラーが発生します。
nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
__dso_handle
は、 グローバル破棄中に動的共有オブジェクトを識別するために使用される である「ガード」です。
現実的には、ここで読むのをやめるべきです。 __dso_handle
をいじってオブジェクトの識別を無効にしようとしている場合は、何かが非常に間違っている可能性があります。
ただし、どこで定義されているかを尋ねたので、答えは複雑です。その定義の場所(GCCの場合)を表示するには、C++ファイルでiostream
を使用し、その後、extern int __dso_handle;
を実行します。これにより、型の競合が原因で宣言の場所が明らかになるはずです(ソースについては このフォーラムスレッド を参照してください)。
手動で定義 の場合もあります。
コンパイラによってインストールされる「ランタイム」によって定義/提供される場合があります(実際には、CRTは通常、バイナリヘッダー/エントリポイント管理コードの束、および一部の出口ガード/ハンドラーです)。 GCCの場合(他のコンパイラがこれをサポートしているかどうかはわかりません。サポートしている場合は、ソースに含まれます):
多くの場合、stdlibで定義されています。
参考文献:
私はこの問題に遭遇しました。確実に問題を引き起こしていると思われる条件は次のとおりです。
-nostdlib
(一般的な小さな埋め込みシナリオ)。std::vector
です。以前は、これはstd::array
静的に問題なく割り当てられていました。明らかに、静的に割り当てられたすべてのstd::
オブジェクトが問題を引き起こすわけではありません。これがユースケースである場合は、コマンドラインオプションをコンパイル/リンクコマンドラインに追加するだけです。-fno-use-cxa-atexit
これは __ dso_handleの使用法を '動的共有オブジェクトへのハンドル' への非常に良いリンクです。
ページにタイプミスがあるようですが、確認のために誰に連絡すればよいかわかりません。
オブジェクトのコンストラクタデストラクタを呼び出した後、GCCは自動的に関数を呼び出します...
これは「すべてのデストラクタが呼び出されると、GCCが関数を呼び出す」と読む必要があると思います...
これを確認する1つの方法は、前述のように__cxa_atexit
関数を実装してから、プログラムをシングルステップで実行し、どこで呼び出されるかを確認することです。私は最近それを試してみますが、今はしません。