問題タブ [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 を使用して、ロードしたライブラリ ファイルへの変更にどのように対処できますか?
dlopen を使用して動的ライブラリ (Linux、i386、.so) をロードする C++ で書かれたプログラムがあります。その後ライブラリ ファイルを変更すると、プログラムがクラッシュする傾向があります。おそらくファイルは単にメモリにマップされているため、これは理解できます。
私の質問は、ファイルのコピーを自分で作成してそれを dlopen する以外に、その後の変更に対して安全な共有オブジェクトをロードする方法、またはロードした共有オブジェクトへの変更から回復する方法はありますか? ?
明確化:問題は、「プログラムをクラッシュさせずに新しいライブラリをインストールするにはどうすればよいか」ではなく、「私が管理していない誰かがライブラリをコピーしている場合、それを防ぐことができるか?」です。
linux - Linux dlopen:ライブラリがロードされたときに「通知」できますか?
共有ライブラリがロードされたときに「通知」される方法はありますか?
つまり、共有ライブラリでdlopenを使用するとします。共有ライブラリで (存在する場合) 自動的に呼び出される関数はありますか (例: main?)
linux - 動的にロードされたときのライブラリパス?
ライブラリ自体の中から共有ライブラリのパスを取得するにはどうすればよいですか?
言い換えると、ライブラリXがをdlopen()
使用してロードされているとしましょう。ライブラリ自体の内部からライブラリをロードするために使用されたパスにアクセスするにはどうすればよいですか?
そもそもライブラリをロードしたエージェントにこのパラメータを渡してもらうことはできないことに注意してください。
更新:静的変数を操作する方法は次のとおりです。
linux - 「exec」機能へのアクセスを無効にしますか?
動的ライブラリ「L」をロードするプロセス「A」があるとします。
Q: "L" 内の関数への "exec" 関数へのアクセスを無効にする方法はありますか?
macos - dlopen: 適切な画像が見つかりません (マップできません) の原因は何ですか?
dlopen を使用して追加のバンドルをロードするときに次のエラーが発生する原因:
このエラーが発生する前に、プロセスは大量のメモリを割り当てます。
($(OBJ_DIR)
読みやすくするために、実際のパスのエラーに置き換えられます)。
dylib - dlopenを使用してdylibバージョンを検索する
パスを使用してdylibのバージョンを見つける方法はありますか?dlopenと同じ引数を受け入れるものを探しています。NSVersionOfRunTimeLibraryを見てきましたが、ドキュメントを読んだところ、パスで指定されたものではなく、現在のdylibのバージョンを取得しているように見えます。
ありがとうございました
c++ - dlopen/dlsym で使用すると、dynamic_cast が失敗する
はじめに
長い質問を前もってお詫び申し上げます。できる限り短くしていますが、残念ながらそれほど短くはありません。
設定
A と B の 2 つのインターフェイスを定義しました。
次に、クラス C のオブジェクトを構築し、A と B の両方を実装してから、それらの A インターフェイスへのポインタを渡す共有ライブラリ「testc」があります。
最後に、2 番目の共有ライブラリ「testd」があります。これは、A*
入力として を受け取り、それを にキャストしようとしますB*
。dynamic_cast
最後に、メイン アプリケーションA*
があり、ライブラリ間で 'sを渡します。
質問
「testc」および「testd」ライブラリにリンクしてメイン アプリケーションをビルドすると、すべてが期待どおりに機能します。ただし、「testc」および「testd」に対してリンクしないようにメイン アプリケーションを変更し、代わりにdlopen
/を使用して実行時にロードするとdlsym
、dynamic_cast
失敗します。
私はなぜなのか理解していない。手がかりはありますか?
追加情報
- gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) でテスト済み
- サンプルコードが利用可能
linux - アプリケーションの起動中にロードされた共有オブジェクトを見つける方法は?
rlTD_NOLOADでdlopenを使用すると、共有オブジェクトがすでにロードされているかどうかを確認できることを知っています。ただし、これが実行可能ファイルにリンクされていて、アプリケーションの起動時にリンカによってロードされた場合、これは機能しないようです。
つまり、mylib.soがあり、それをdlopenでロードするとします。後で、RLTD_NOLOADを使用してdlopenを作成すると、期待どおりにハンドルが取得されます。
ただし、mylib.soをアプリケーション(makefileの-lmylib)にリンクすると、dlopenはNULLを返します。
共有オブジェクトがexecに直接リンクされている場合、どうすれば共有オブジェクトへのハンドルを取得できますか。明示的にロードされていませんか?
前もって感謝します
c - リンクをできるだけ少なくしたdlopen/dlsym
dlopenを使用して実行時にロードされるプラグインを利用できるアプリケーションがあります。各プラグインは、共通の構造を使用して定義されたプラグイン情報を取得する関数を定義します。そんな感じ:
これはうまく機能し、プラグインをロードできます。ここで、アプリケーション全体をリンクせずにこれらのプロパティを読み取るための小さなツールを作成したいと思います。それを行うために、私はこのようないくつかのコードを持っています:
これは、単純なプラグインに適しています。問題は、多くのプラグインがアプリケーションからさらにシンボルを参照していることです。これらのシンボルは、RTLD_LAZYが設定されていても解決されます。(プラグイングローバルのものを初期化するために使用されるアプリケーションからのグローバル変数のように)したがって、dlopen()呼び出しは。のようなエラーで失敗しますfatal: relocation error: file sample_plugin.so: symbol application_some_symbol: referenced symbol not found
。単一の単純な構造にアクセスしたいだけなので、リンカーが彼の作業の多くを実行するのをどのように防ぐことができるのか疑問に思いました。
c++ - ダイナミックライブラリとメインプログラムの静的クラス変数
静的なstlコンテナクラスを含むクラス「A」を持つプロジェクトに取り組んでいます。このクラスは、私のメインプログラムと.soファイルの両方に含まれています。このクラスは、デフォルト(暗黙的、宣言されていない)コンストラクタ/デストラクタを使用します。メインプログラムは、dlopen()を使用して.soファイルをロードし、そのデストラクタでdlclose()を呼び出します。glibcが静的クラスメンバー変数のデストラクタを呼び出すと、メインが終了した後にプログラムがクラッシュします。問題は、dlclose()が呼び出されると、静的変数のデストラクタが呼び出され、次にmain exits()がデストラクタも呼び出すと、ダブルフリーが発生することです。
2つの質問があります
。1)この特定のケースでは、静的変数のコピーが2つないのはなぜですか(はい、それはややばかげているように聞こえますが、メインプログラムと.soファイルの両方に別々にコンパイルされた「A」があるためです、それぞれに1つあるべきではありませんか?)
2)静的メンバー変数を含まないようにクラス「A」を書き直さずにこの問題を解決する方法はありますか?