問題タブ [dlsym]
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++ - 共有ライブラリ (Solaris、Sun Studio) にグローバル関数ポインタを設定する
Fortran 95 ライブラリを中心に小さな C++ ラッパー共有ライブラリを作成しています。Fortran シンボルにはシンボル名が含まれているため、Fortran 関数を C++ 関数ポインターにロードする.
ために使用する必要があります。dlsym
現在、ヘッダー ファイルに一連のグローバル関数ポインターがあります。
そして、それらを対応する C++ ファイルに入力します。
質問:
- このようにすると、これらのポインターはいつ入力されますか?
- このライブラリをロードする実行可能ファイルにそれらがロードされていると想定できますか?
- 特に、実行可能ライブラリまたは他のライブラリで静的に作成されたオブジェクトでこれらの関数を使用できますか? それとも、これは静的初期化順序の大失敗に悩まされていますか?
- 上記の方法が正しくない場合、実行可能ファイルやその他のライブラリの静的オブジェクトで使用できるように、これらのポインターを設定する最もエレガントな方法は何ですか?
私は Solaris で Sun Studio コンパイラを使用していますが、それが違いを生むのであれば、Linux での GCC のソリューションにも興味があります。
c - dlopenの問題(OSX)
メイン プログラムからエクスポートされた関数を呼び出したいdylib
内部からを動的にロードするメイン アプリケーションがあります。メインアプリケーションdylib
を取得dlopen(NULL,flag)
し、. handle
dlsym(handle, symbol)
function
dlopen
与えますが、私no error
がしようとすると、次のようになります:dlsym
function
error
シンボルはnmによって確認されて修正されてエクスポートされます
なぜそこにあるのかわからないのRTLD_NEXT
ですか? これはの結果dlopen(NULL,flag)
ですか?
どうすればこの問題を解決したり、目標を達成したりできますか?
または、メインアプリケーションを呼び出す他の方法はありますか (関数ポインターを dylib に渡すことはできません)。
前もって感謝します!
追加した:
書き出す:
nmの結果
dylib のコード:
c - dlsym-オーバーライドされたシンボルを取得します
ライブラリを動的にロードするアプリケーションがあり、ライブラリを動的にロードします...
Windowsでは、ロードされたすべてのモジュールを繰り返し処理して、関心のあるシンボルを探すことができます。Unix/Linux環境でそれを行う方法がわかりません。最初の2つのシンボルを使用するdlsym(dlopen(0, flag))
かdlsym(RTLD_DEFAULT / RTLD_NEXT)
、検索するモジュールの順序を知っています。どのようにして、より深く、特定のシンボルのすべての定義を取得できますか?
c - dlsym による FSGetCatalogInfo のオーバーライド
DYLD_INSERT_LIBRARIES を使用して OS X Lion 10.7 で FSGetCatalogInfo 関数をオーバーライドしようとしていますが、元の FSGetCatalogInfo 関数を実際に呼び出すまではすべて正常に動作し、その時点で「バス エラー: 10」が発生します。
私のコードスニペットは次のとおりです。
元の FSGetCatalogInfo を間違って定義または呼び出しているに違いないと考えていますが、どこで失敗しているのか正確にはわかりません - アイデアですか?
c++ - エラー: void 値が無視されないはずです
動的ライブラリから関数シンボルを取得しようとしていますが、新しい関数ポインターを使用して関数をライブラリ関数に置き換える必要があります。コードは c++ ファイルで記述されます。
次の手順を使用しました。
しかし、コンパイル時に、この「エラー: void 値は無視されないはずです」というエラーが発生します。
上記の状況を解決するにはどうすればよいですか?
ありがとう
c - dlsym による関数割り込みのクリーンアップ
malloc ラッパーとして、次の従来のコード スニペットを使用します。
プログラムの最後に dlsym によって割り当てられたバッファがまだあるため、Valgrind は動揺します。
これらのリソースを解放するにはどうすればよいですか? ありがとう
c - Dynamic Library Function Call
I have the following code which simply loads the library test.so from the current directory and executes the version
function within that library. What should be returned is a string. What is instead returned is junk from the stack(a pointer location maybe?). Does anyone have any idea why the following code would be failing.
c - dlsym の戻り値をキャッシュする必要がありますか?
私はPOSIX dlopen
/ dlsym
APIを使用して、実行時に動的ライブラリをロードし、それらのライブラリから名前で関数を呼び出しています。
dlsym
どこかに結果を保存することは、パフォーマンス面で良い考えですか? それとも、dlsym は既に独自のキャッシングを行っており、別のレイヤーを追加することは役に立たないか、有害でさえありますか? 関数は潜在的に何度も呼び出される可能性がありますが、どの関数が呼び出されるか、またはどのくらいの頻度で呼び出されるかを事前に知る方法は実際にはありません。
ありがとう!
c++ - C++シンボル名をマングルするLinuxユーティリティは何ですか?
シンボルをc++filt
デマングルするコマンドがありますが、反対のことを行ってシンボル名をマングルするツールは何ですか?
dlsym()
これは、マングルされた C++ 関数名を呼び出したい場合に便利です。新しいコンパイラ バージョンや新しいコンパイラ ブランドが使用されているため、または現在複数のプラットフォーム用にコンパイルされているために、時間の経過とともに変更される可能性があるため、コード内の名前マングリングをハードコーディングしたくありません。
コードがコンパイラに依存しないように、実行時に C++ 関数を表す文字列をプログラムで取得する方法はありますか? これを行う 1 つの方法は、コンパイル時に、使用されているコンパイラの名前マングリングを実行し、適切なマングルされた C++ シンボル名dlsym()
を使用する文字列に挿入するユーティリティを呼び出すことです。
これは、このサイトで見つけた解決策に最も近いものです。これは、固定の C スタイル名を使用して、必要なライブラリで定義されている C++ シンボルを間接的に使用することによって達成されますが、dlsym()
そのライブラリを制御できない場合これはオプションではありません。