問題タブ [dlopen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
5256 参照

shared-libraries - メイン プログラムと共有ライブラリは、__static_initialization_and_destruction_0 で同じ静的変数を初期化します

dlopen() 内で初期化されたライブラリがメインプログラムが所有する静的変数を初期化する理由を知っている人はいますか? メイン プログラムと共有ライブラリの両方に静的変数のコピーがありますが、何らかの理由で共有ライブラリがメイン プログラムの静的変数のコピーを再初期化して破棄し、メイン プログラムがそれを破棄しようとすると segfault が発生します。

これは、シンボル テーブルでの不適切な名前マングリングの場合ですか?

0 投票する
5 に答える
8767 参照

c - 共有ライブラリのシンボルテーブルを返す

例えば:

エラーがないと仮定すると、初期化子は共有ライブラリlibSDK.soの関数SD_Initを指します。

ただし、これには、シンボル「SDL_Init」が存在することを知っている必要があります。

ライブラリにそのすべてのシンボルを照会することは可能ですか?たとえば、この場合、SDL_Init、関数ポインター、およびlibSDL.soによってエクスポートされたその他のシンボルが返されます。

0 投票する
1 に答える
1621 参照

linux - Linux で、dlopen が SIGFPE を発行する原因は何ですか?

file私は、32ビット実行可能ファイルとして識別される疑わしい起源のライブラリを持っています。ただし、dlopen32 ビットの CentOS 4.4 マシンで試してみると、dlopen は で終了しSIGFPEます。確かに、バイナリのフォーマットに何か問題があった場合dlopen、エラーを処理する必要がありますか?

問題は次のとおりです。dlopen が SIGFPE を発行する原因となる問題は何ですか?

0 投票する
1 に答える
1943 参照

python - python c 拡張機能、mac os での dlopen の問題

バイナリ ライブラリ (.a) およびヘッダーとして配布されているライブラリを使用し、それに対していくつかの C++ コードを記述し、結果を Python モジュールにラップしたいと考えています。

私はこれをここでやった。

問題は、このモジュールを Mac OSX (10.5 と 10.6 を試しました) にインポートすると、次のエラーが発生することです。

これは、Carbon フレームワークで定義されたシンボルが適切に解決されていないように見えますが、どうすればよいかわかりません。のパラメータ-framework Carbonを指定しているので、他に何をすべきかわかりません。distutil.core.Extensionextra_link_args

どんな助けでも大歓迎です。

アップデート:

setup.py によって生成されるコンパイル行は次のようになります。

リンカー行は次のようになります。

otoolレポート:

更新 2 : MacOS 10.5 では、dlopen フラグをデフォルトの から に変更RTLD_NOWするRTLD_LAZYと、問題が解決します。ただし、これは Mac OS 10.6 では機能しません。

10.6 では、次のシーケンスでライブラリを適切に実行できますが、理由はわかりません。

  1. python setup.py ビルド -v
  2. リンカー行 (setup.py によってコンソールに出力されます) を手動で再度実行します。
  3. python setup.py インストール

これを適切に機能させる方法については、まだ良い答えを探しています。ありがとう!

0 投票する
1 に答える
9587 参照

android-ndk - Androidアプリケーションで実行時にライブラリをロードできません

私は、ネイティブ C コードに JNI を使用した Android アプリケーションに取り組んでいます。このアプリケーションを Android 2.0 バージョンと ndkr3 でビルドすると、正常に動作します。

Android SDK バージョン 1.5 と API バージョン 3 を変更したとき、ライブラリ libtest_demo.so を開けないという問題に直面しました。

libtest_demo.so ファイルを同じ場所 /data/data/org.abc.test_demo/lib/libtest_demo.so に配置しましたが、それでも同じ問題が発生します。

私のJavaファイルでは、次のようなネイティブライブラリを呼び出しました

logcat から、両方のライブラリが同じメモリ アドレスを使用していることがわかりました。

これは logcat の出力です

0 投票する
2 に答える
4129 参照

linux - dlopen() を使用した共有オブジェクトの動的ロード

私はプレーンな X11 アプリに取り組んでいます。

デフォルトでは、私のアプリは libX11.so と標準の gcc C および数学ライブラリのみを必要とします。このアプリは、Xfixes、Xrender、および ALSA サウンド システムで機能を拡張できます。ただし、これら (Xfixes、Xrender、および ALSA) の機能はオプションです。

この動作を実現するために、ランタイム ローディングを使用しています。つまり、libXfixes、libXrender、および libasound を dlopen() する必要があります。

したがって、アプリはそのようなライブラリがなくても機能します。

今私の質問:

これらはディストリビューションごとに異なることがわかりました。
たとえば、openSUSE 11 では、次のように名前が付けられます。

  • libXfixes.so
  • libXrender.so
  • libasound.so

ただし、Ubuntu では、次のように、名前にバージョン番号が付いています。

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

したがって、「libXfixes.so」を開こうとすると、Ubuntu では失敗しますが、lib は明らかにそこにあります。バージョン番号が添付されているだけです。では、私のアプリはこれをどのように処理すればよいでしょうか?
アプリで最初に /usr/lib/ を手動でスキャンして、どのライブラリがあるかを確認し、次に適切なものを選択する必要がありますか? または、誰かがより良いアイデアを持っていますか?

みんなありがとう、

アンディ

0 投票する
1 に答える
2450 参照

c++ - 未定義シンボル GCC / C++ 動的にロード可能な *.so オブジェクト

- netsnmp mib をコンパイルして、snmp エージェントの機能を拡張しようとしています。

  • デーモンを起動して共有オブジェクト (*.so) をロードしようとすると、デーモンは未定義のシンボルについて不平を言います。「dlopen に失敗しました: Filename.so: 未定義のシンボル: netsnmp_container_table_row_extract」

  • さらに突き進むと #nm -D -u Filename.so 、未定義の参照/シンボルが多数出力されます

  • これらの参照の一部は system calls、snmp エージェントに固有のものです。

  • コードのコンパイルに問題はありません。欠落しているすべての参照/シンボルは、netsnmp エージェントへの呼び出しです。

質問 : 1. これらのシンボルを解決せずにコンパイルするにはどうすればよいですか? AFIK : これらのシンボルは静的に解決されている必要があります。2. システムが実行時にこれらを解決できないと思いますか? 3. どうすればこの問題を解決できますか? 助言がありますか

ありがとうSS

0 投票する
3 に答える
2184 参照

c++ - C++ サンドボックス ダイナミック ライブラリ

動的にリンクされたライブラリを dlopen や友人を介してサンドボックス化することが可能かどうか疑問に思っています。目的は、SEGFAULT などのアプリケーション全体を破壊することなく、ライブラリ内のエラーから回復することです。

誰もがこの分野で何か経験がありましたか?

0 投票する
2 に答える
3155 参照

linux - 2 つの共有ライブラリを使用した dlopen、シンボルのエクスポート

を使用して実行可能ファイルからロードされる Linux 共有ライブラリ foo.so がありますdlopen("foo.so", RTLD_NOW | RTLD_LOCAL)。foo.so から、foo.so で定義されたシンボルを参照する別のライブラリー bar.so を dlopen したいのですが、リンカーがそれらを見つけられません。ロードを行う実行可能ファイルのソースがないため、RTLD_LOCAL を RTLD_GLOBAL に変更できません。foo.so をリンクすると役立つかもしれないと思い-Wl,--export-dynamicましたが、ローカル フラグを dlopen にオーバーライドしません。GCC の新しい属性可視化機能も、答えを提供しているようには見えません。

bar.so の未定義シンボルへの参照を foo.so のそれらの定義に解決するようリンカに指示できる方法はありますか? ? 私が思いつく唯一のことは、foo.so 自体から RTLD_GLOBAL を使用して foo.so を dlopen することです。次に、bar.so を dlopen しますが、これは少し面倒です。ありがとう。

0 投票する
2 に答える
3844 参照

c++ - OSX で dlopen を介してライブラリを開いたときのクラッシュのデバッグ

dlopen を使用してユーザーが開発したライブラリをロードする、私が開発した C++ アプリケーションに問題があります。このアプリケーションは、過去数年間、さまざまな Linux ディストリビューションや OSX のバージョンでさまざまな人々によって使用されてきたので、私の dlopen の使用は問題なく、それに依存するコードも問題ないと思います (ええ、これは傲慢なので、失敗したら報告します)。私が今抱えている問題は、ユーザーが開発したライブラリが私のシステム (OSX 10.6.4) にロードされないことです。システムがそれを読み込もうとすると、フリーズしてからクラッシュします。クラッシュ レポートでは、クラッシュするスレッドは次のようになります。

(必要に応じて完全なログを投稿できますが、投稿に含めると本文テキストの制限を超えます)

実行可能ファイルを実行しているターミナルでは、実行可能ファイルを実行しているスクリプトがシグナルをトラップしたという通知を除いて、クラッシュは出力を生成しません。

私の質問は、このクラッシュの原因についてより多くの情報を得るにはどうすればよいですか? 誰かが考えられる解決策を提案してくれるのもうれしいですが、まず、システムがクラッシュしたときに実際に何が問題なのかについて、より多くの情報を生成する方法を知りたいと思います。

最初に dlopen によって開かれているライブラリで otool を実行すると、すべてが正常に見えます (リンクの欠落、シンボルなどはありません)。私の主な疑いは、ロードされているライブラリがリンクされているライブラリの特定の組み合わせが、何らかの形でこのクラッシュを引き起こしているということです。これらのリンクされたライブラリの異なるサブセットを使用するこれらの他のライブラリをロードできます。記録のために、ライブラリには X11、ZeroC の Ice、Player/Stage、および OpenCV が含まれます (後者の 2 つは MacPorts を使用してインストールされた依存関係で手動でコンパイルされます)。OpenCVを除くこれらすべてにリンクする他のライブラリは問題なくロードできるため、OpenCVが含まれていることが問題の原因のようです。これらは私の疑いですが、現在、さらに調査するためのノウハウが不足しています.

ありがとう!ニック

更新: Kaelin の回答 (以前は認識していなかった DYLD_PRINT_* オプション) のおかげで、少なくとも完全に明白なことが何も起こっていないことを確認できました。デバッグ情報を使用して、クラッシュの原因となっている特定のライブラリに問題を絞り込むことができました。このライブラリ (OpenCV で libhighgui を介してアプリにリンクされた libdc1394) が CoreServices に対して正しくリンクされておらず、これがクラッシュの原因であることが判明しました。何らかの理由で、エラーが他のものによって隠され、最終的なクラッシュが発生しました。libdc1394 の問題については、こちらを参照してください。残念ながら、ここで報告できる完全な修正を行うことができなかったため、危険なライブラリにリンクしていないバージョンのアプリを実行することができました (OpenCV コンパイルで libdc1394 をオフにすることにより)。