問題タブ [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.
c++ - 相対パスでの dlopen エラー
別の .dylib ファイルから .dylib ファイルを呼び出そうとしています。それらは同じフォルダーにあります。私はこれをします:
void* ハンドル = dlopen("./other.dylib", RTLD_LAZY);
しかし、ハンドルは NULL になり、dlerror() はそれが見つからないと言います。ただし、絶対パスを使用すると機能します。ドキュメントには、相対パスを使用できると書かれています。スペルとケースが正しいと確信しています。
なぜエラーになるのですか?
c - モジュールをロードするためのこの単純な C テスト プログラムを動作させるにはどうすればよいですか?
Linux で dlopen と dlsym を使用して、次の 2 つのソース ファイルを機能させます。
と:
しかし、最初のものをコンパイルすると、次のように言い続けます:
main.c:9: エラー: 代入の左オペランドとして左辺値が必要です
編集: キャストを追加して、それを関数ポインターにしようとしましたが、今では次のように表示されます: main.c:(.text+0x1f): dlopen'
main.c:(.text+0x2b): undefined reference to
dlsym への未定義の参照'
c++ - LinuxでのRTLD_LOCALおよびdynamic_cast
アプリケーションの実行中に更新する必要のあるいくつかの共有ライブラリで構成されるプラグインがアプリケーションにあります。パフォーマンス上の理由から、古いプラグインをアンロードする前に新しいプラグインをロードして使用を開始し、すべてのスレッドが古いプラグインの使用を完了した場合にのみ、プラグインをアンロードします。新しいプラグインと古いプラグインのライブラリには同じシンボルが含まれているため、をdlopen()
使用しRTLD_LOCAL
ます。新しいプラグインが誤って内部関数から古いプラグインのシンボルを呼び出さない場合。
プラグインの1つのライブラリは、プラグインのdynamic_cast()
別のライブラリによって作成されたオブジェクトに対して実行されます。これは、HP-UX、AIX、Solaris、およびWindowsで機能しますが、Linuxでは機能しません。私が理解できる限り、これは、これらすべてのOS(コンパイラ)がクラスの名前を使用して(内のdynamic_cast()
)型を比較しているのに対し、Linuxは名前文字列アドレスを使用してこの比較を行っているため(パフォーマンスを向上させるため)、各ライブラリには独自のライブラリがあるためです。type_info
オブジェクト(でロードされたためRTLD_LOCAL
)アドレスが異なるため、等しいタイプは。と等しくないようdynamic_cast()
です。
次のいずれかを行う方法はありますか?
- 提供されたかのように、オブジェクトのみ
type_info
がロードされるようRTLD_GLOBAL
にします。 - コンパイラーに
type_info
、タイプ間の比較にアドレスではなくクラス名の比較を使用させる。
?使用しているコンパイラは次のとおりです。
c++ - dlopen()を介してアプリケーションにプラグインするプラグインをリンクする方法
アプリケーション用のプラグインを書いています。アプリケーションは、を使用してプラグインをロードしますdlopen()
。プラットフォームはFedoraLinux11です。アプリケーションのすべてのソースコードがあります。
コードをアプリケーションに正常に追加しましたが、アプリケーション全体が一度にリンクされていたため、正常にリンクされました。ただし、最終的には、コードを別のプラグインにしたいです。
プラグインとしてコードを作成するのに問題があります。共有(.so)ライブラリとして構築しています。私のコードは当然アプリケーション内のシンボルを参照しているため、プラグインがg++
-L
and-l
オプションを使用してリンクするライブラリを指定する必要があります。ただし、私のプラグインを受け入れるアプリケーションは、.soライブラリのセットではなく、単一の実行可能ファイルです。
ここでいくつかの基本的なポイントが欠けています。プラグインをリンクするにはどうすればよいですか?
私はまだプラグインをビルドしようとしていることに注意してください-私はまだプラグインを使用してロードしようとしているところまで来ていませんdlopen()
。
解決策:ご回答ありがとうございます。nemoによって提案された--just-symbolsメソッドを使用しましたが、うまく機能しました。ありがとう!
shared-libraries - sprof が「ld.so によって検出された矛盾」について不平を言う原因は何ですか?
sprof を使用して、ほとんどすべてのコードが共有ライブラリにあるソフトウェア (ossim) のプロファイルを作成しようとしています。プロファイリング ファイルを生成しましたが、sprof を実行すると、次のエラーが発生します。
私が従った指示によると、少なくとも 2.5-34 の libc バージョンが必要で、私は libc バージョン 2.12.2 (Gentoo、カーネル 2.6.36-r5) を持っています。
エラーの意味や (さらに興味深いことに) 修正方法についての説明が見つかりません。半分関連性のある Google の結果は、古いバージョンの Skype のバグに関するものだけです。
c - コントロールが共有ライブラリに入る直前にシステムコールをキャッチする
write()、open() などの多くのシステム コール関数をラップし、LD-PRELOAD を使用して元のシステム コールをオーバーライドしました。さらに、さらにいくつかの関数を定義し、これもシュレッド ライブラリにしました。
共有ライブラリに入る前に、さまざまなアプリケーション プロセスからこれらの共有ライブラリへのすべてのシステム コールをキャッチしたいと考えています。どうやってやるの?
ありがとう
c - ライブラリから実行可能ファイルの関数を呼び出す方法は?
実行可能ファイルと動的ライブラリ (.so) があります。ライブラリはいくつかのシンボルをエクスポートし、実行可能ファイルはそれを正常に呼び出します。しかし、実行可能関数のライブラリ呼び出しを可能にしたいと考えています。実行可能ファイルで次のことを試みました:
そしてこれはライブラリにあります:
dlopen
しかし、 (ライブラリをロードするために)実行可能ファイルを呼び出すと、エラーが返されますundefined symbol: print
。どうすれば修正できますか?
c++ - c++ダイナミックライブラリdlopenエラー
私は2つのファイルを持っています:RollDice.cpp
RollDice.h:
次のコマンドで.soファイルを作成します:g ++ -shared -o RollDice.so RollDice.cpp
そして今、私のアプリケーションでこのプラグインを開きたいと思います:
しかし、メッセージが表示されます:ライブラリを読み込めません:./ RollDice.so:無効なELFヘッダー
これを解決するのを手伝ってもらえますか?
-fPIC
助けにはならない
編集:
今、私はプラグインを構築しています:
そして私は新しい問題を抱えています:シンボルをロードできませんcreate:./ RollDice.so:未定義のシンボル:create
nm
RollDiceにどのシンボルがあるかを確認するために使用すると、「作成」が表示されません
c++ - dlopen() を使用して開かれたライブラリのカバレッジを見つける方法は?
別のアプリケーションで dlopen() を使用して開かれる C++ ライブラリ (.so) があります。しかし、gcov を使用してアプリケーション内で実行している間に、このライブラリのコード カバレッジを見つける必要があります。出来ますか?はいの場合、どのように行うことができますか?
そうでない場合、問題はどのように解決できますか?
c - dlopen / dlsym / dlclose(dlfcn.h)によりメモリリークが発生する
このようにdlfcnファミリを使用する場合:
メモリリークが発生します。
私の質問は、これはプログラミングエラーですか、それともdlfcn / libdl.soのバグですか?