web-dev-qa-db-ja.com

__dso_handleはどこで定義されていますか?

プログラムをコンパイルしようとすると、__dso_handleが見つからないと文句を言う未解決のシンボルエラーが発生します。この関数は通常どのライブラリで定義されていますか?

次のnm on libstdc++.so.6の結果は、それが含まれていることを意味しますか?

リンクしようとしましたが、それでもエラーが発生します。

nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
14
revit

__dso_handleは、 グローバル破棄中に動的共有オブジェクトを識別するために使用される である「ガード」です。

現実的には、ここで読むのをやめるべきです。 __dso_handleをいじってオブジェクトの識別を無効にしようとしている場合は、何かが非常に間違っている可能性があります。

ただし、どこで定義されているかを尋ねたので、答えは複雑です。その定義の場所(GCCの場合)を表示するには、C++ファイルでiostreamを使用し、その後、extern int __dso_handle;を実行します。これにより、型の競合が原因で宣言の場所が明らかになるはずです(ソースについては このフォーラムスレッド を参照してください)。

手動で定義 の場合もあります。

コンパイラによってインストールされる「ランタイム」によって定義/提供される場合があります(実際には、CRTは通常、バイナリヘッダー/エントリポイント管理コードの束、および一部の出口ガード/ハンドラーです)。 GCCの場合(他のコンパイラがこれをサポートしているかどうかはわかりません。サポートしている場合は、ソースに含まれます):

多くの場合、stdlibで定義されています。

参考文献:

16
Zac B

私はこの問題に遭遇しました。確実に問題を引き起こしていると思われる条件は次のとおりです。

  1. c/C++標準ライブラリを使用しないg ++リンク:-nostdlib(一般的な小さな埋め込みシナリオ)。
  2. 静的に割り当てられた標準ライブラリオブジェクトを定義します。私の場合に固有ののはstd::vectorです。以前は、これはstd::array静的に問題なく割り当てられていました。明らかに、静的に割り当てられたすべてのstd::オブジェクトが問題を引き起こすわけではありません。
  3. 私はどのタイプの共有ライブラリも使用していないことに注意してください。
  4. GCC/ARMクロスコンパイラ が使用されています。

これがユースケースである場合は、コマンドラインオプションをコンパイル/リンクコマンドラインに追加するだけです。-fno-use-cxa-atexit

これは __ dso_handleの使用法を '動的共有オブジェクトへのハンドル' への非常に良いリンクです。

ページにタイプミスがあるようですが、確認のために誰に連絡すればよいかわかりません。

オブジェクトのコンストラクタデストラクタを呼び出した後、GCCは自動的に関数を呼び出します...

これは「すべてのデストラクタが呼び出されると、GCCが関数を呼び出す」と読む必要があると思います...

これを確認する1つの方法は、前述のように__cxa_atexit関数を実装してから、プログラムをシングルステップで実行し、どこで呼び出されるかを確認することです。私は最近それを試してみますが、今はしません。

10
natersoz