問題タブ [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++ - 共有オブジェクトは、メイン バイナリ、C++ でシンボルを見つけることができません
私が書いたプログラムの一種のプラグイン アーキテクチャを作成しようとしていますが、最初の試みで問題が発生しました。共有オブジェクト内からメインの実行可能ファイルからシンボルにアクセスすることは可能ですか? 以下でいいと思いました。
testlib.cpp:
testexe.cpp:
以下でコンパイル:
出力:
だから明らかに、それは大丈夫ではありません。したがって、2 つの質問があると思います: 1) 共有オブジェクトに、ロード元の実行可能ファイル内のシンボルを検索させる方法はありますか?プログラム内で実行するには?
c - C共有ライブラリの質問
バックグラウンド:
C を学習する方法として、ゼルダ (NES) に似た単純なゲームを C で開発しようとしています。すべてのゲーム データを 1 つのファイルに格納するのは理想的ではないという結論に達しました。そこで私がやりたいのは、各「領域」を独自のモジュールに分割することです。この「エリア」モジュールは、タイル マップ、特定のイベントでトリガーする関数などのプロパティをメイン プログラムに記述し、メイン プログラムのゲーム API を呼び出してアクター/サウンド/その他を操作します。画面上。したがって、これらのモジュールは実行時にロード/アンロードする必要があります。本質的に、メイン プログラムは、この「エリア」モジュールから供給されるデータに基づいて動作するステート マシンです。
これらの共有モジュールを作成しようとしましたが、メイン プログラムで定義された関数が area モジュールから見えるようには見えません (少なくとも同じスコープではありません)。これは、リンクを間違っているためだと確信しています。だから私がやったことは、うまくいく概念の証明を考え出すことです. 以下は、失敗した私の概念実証です。
api.h
エリア.c
game.c
build.sh
建てる:
$ ./build.sh
プログラムは以下を生成します。
$ ./ゲーム
名前: (ヌル)
名前: エリア 1
私がやろうとしていることは可能ですか?そうでない場合は、すべての API 呼び出しを area モジュールに登録するという別のアイデアがあります... しかし、それは私にとって理想的ではありません。
マシン情報: gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3.
c++ - dlclose() は、グローバル オブジェクトのデストラクタを呼び出しません。
plugin1.cpp:
ホスト.cpp
ビルドして実行:
TestStatic::~TestStatic が「dlclose()」ではなく「exit()」で呼び出されるのはなぜですか?
libtool - ファイルが正しいパスにある場合、dlopen が file not found で失敗する
パッケージのライブラリ ディレクトリにインストールされる libtool を使用してビルドされたライブラリがあります/usr/local/lib/myprog/libmylib.so
。libltdl を使用してコードにライブラリを動的にロードしています。このライブラリを 1 台のマシンにロードしようとすると、問題なく動作します。別の例では、同じビルドとライブラリが同じ場所にインストールされていると、「ファイルが見つかりません」というエラーが発生します。
lt_dlforeachfile
(ライブラリをロードするために使用する)直前に呼び出すとlt_dlopenext
、必要なライブラリが検索パスで見つかったことをファイル名を出力することで確認できます。しかし、その直後に、「ファイルが見つかりません」というエラーでロードに失敗します。助言がありますか?
アップデート
dlopen
ライブラリへの絶対パスを使用して明示的に指定するように切り替えてみました。これは、一部のシステムでは機能し、他のシステムでは機能しません。
python - モジュールのインポート時にエラーが発生しました、dlopen():シンボルが見つかりません
私は、Mac OSXのAudioUnitフレームワークを使用するPython拡張機能をCで作成しました(実際には、cythonを使用していますが、それは重要ではありません)。モジュールは正しくビルドされますが、Pythonコマンドラインからインポートしようとすると、次のエラーが発生します。
このモジュールをロードするときにAudioUnitフレームワークを使用する必要があることをPythonに伝えるにはどうすればよいですか?
unix - メイン実行可能ファイルの dlopen()/dlsym(): 移植性は?
バイトコードを実行するためのコンパイラと仮想マシンを構築しています。この言語では、一部の外部共有オブジェクトで定義される可能性のある外部 C 関数と、メイン コンパイラ/VM バイナリ (いくつかの重要な言語組み込み) をバインドできます。
strip
メインの実行可能ファイル内のシンボルを dlopen(NULL, ...) で動的にバインドできることはわかっていますが、バイナリで実行した後ではできません。そこで次の質問があります。
- ストリップされたバイナリでこれを行う方法はありますか?
- 一般に、この機能は UNIX システム間でどの程度移植可能ですか?
- どういうわけかWindowsで同じトリックを行うことは可能ですか?
- メインの実行可能ファイル内で動的にバインドする代替方法はありますか?
gcc - 動的ライブラリからの関数のオーバーライド
こんにちは、実行時にカスタマイズしたいグローバル関数を持つプログラムがあります。たとえば、関数 foo() には多くのバージョンが共有ライブラリに散らばっています。ここで、実行時に検出されたシステム構成に基づいて、適切なライブラリの関数を使用したいと思います。
ファイル loader.cpp:
ファイル other.cpp:
プログラムをコンパイルします
ただし、弱いシンボルはオーバーライドされません。ヒントはありますか?
linux - 直接ロードしなかった共有ライブラリ内の関数への関数ポインタを取得する
私の Linux アプリケーション (A) は、ソース コードを持っていないサード パーティの共有ライブラリ (B) にリンクしています。このライブラリは、(C) のソース コードを持っていない別のサード パーティの共有ライブラリを使用します。(B) は直接リンクする代わりに dlopen を使用して (C) にアクセスしていると思います。これについての私の理由は、(B) の 'ldd' は (C) を表示せず、objdump -X (B) は dlopen/dlclose/dlsym への参照を表示することです。
私の要件は、(A) のコードで、(C) にある関数 foo() への関数ポインターを取得する必要があることです。通常、これには dlsym を使用しますが、dlopen から返されたハンドルを渡す必要がありますが、(B) はこれを公開していないため、持っていません。
-
より大きなコンテキストの場合: (C) の関数を変更して、ヘルパー関数 bar() (これも (C) にあります) を呼び出すたびに、(A) にある同じシグネチャを持つ関数も呼び出すようにする必要があります。同じパラメータ (基本的に、(C) foo()->bar() のコードパスにコードを挿入します。gdb を使用してこれを達成する方法を見つけたと思いますが、gdb コマンド リストを移植するために、 「関数ポインタを取得するステップで立ち往生しています.私はまた、上記の正確な問題ではなく、同じタスクを達成するための代替手段を受け入れています.
編集:これを書いた後、私はおそらくコード内のファイルで別の dlopen を実行できることに気付きました。そのハンドルの dlsym を介して返されるシンボルは、元の dlopen を介して受信したものと同じである必要があります。dlopen のマニュアルページを正しく読んでいる場合. しかし、私はまだ、より大きな文脈でのアドバイスや支援に興味があります.これについてもっと良い方法があれば.
c++ - コードユニットを含めないようにする方法としてのC++仮想キーワード
現在、コアへの通信形式を提供するサービスプラグイン(tcp / ip、udp / ip、usbなど)を許可する一連のコードがあります。これらのサービスプラグインは、通知クラスインスタンスをコアにフィードバックしてさらに処理します。
現在の実装では、サービスプロジェクト(実行時にdlopenとその仲間を介してコアによって持ち込まれる別個のダイナミックリンクライブラリ)は、コアソースコード(別個のプロジェクト)にあるnotifier.cppファイルに対してコンパイルされます。これにより、notifiersメソッドの実装にアクセスできます。これは完全に不満なしで動作します。
2つの代替オプション:1。notifierメソッドの実装をヘッダーファイルに配置します。2.通知メソッドを仮想として宣言し、実行時までバインディングを遅らせます。
計算オーバーヘッドの問題を回避するオプション2の影響は何ですか?
他に利用できるオプションはありますか?
ありがとう
c++ - C /C++のdlopenおよびグローバル変数
いくつかの制限により、実行時にCで記述されたライブラリをロードする必要があります。サードパーティは、共有オブジェクトに変換する静的アーカイブとして2つのライブラリを提供してくれます。私が使用しているアプリケーションは、いくつかのハードウェアパラメータに基づいて、実行時にライブラリの1つをロードします。残念ながら、ライブラリの1つは主にグローバル変数で構成されています。
すでにdlsymを使用して関数参照をロードしていますが、dlsymを使用してこれらのグローバル変数への参照もロードできますか?