問題タブ [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++ - *.so が他の *.so の関数を使用している場合の dlopen と dlsym の使用方法
dlopen と dlsym を使用する次のコードがあります。
main.cpp
コンパイルコマンド: g++ main.cpp -ldl
libsql.cpp
libsql.h
コンパイルコマンド: g++ -fPIC -shared -o libsql.so libsql.cpp
アプリケーションを実行すると、次のようなエラーが発生します。
./a.out: シンボル検索エラー: ./libsql.so: 未定義のシンボル: sqlite3_initialize
しかし、libsqlite3 は既にインストールされており、他のプログラムで正常に動作します。
c - dlopen で読み込まれた共有ライブラリからグローバル シンボルを参照する
メインプログラムからシンボルにアクセスしたい共有ライブラリがあります。例えば:
main.c
foo.c
私は次のようにコンパイルして実行します:
そして、期待どおりの出力が得られます。
ただし、ライブラリがロードされるタイミングを制御したいのでdlopen()
、 andを使用する必要があります。dlsym()
変更されたファイルは次のとおりです。
main.c
foo.c
代わりに、次のようにコンパイルして実行します。
ただし、今回は出力を取得します
libfoo からメインプログラムのシンボルを参照するにはどうすればよいですか?
c++ - シンボル テーブルを使用して、C++ で名前で変数を参照する
基本的にタイトルが求めるもの。
や、シンボル テーブルなどのより高度な概念に少し慣れていないため、C++
オンラインで調べましたが、最終目標が何であるかについての方向性を見つけるのに苦労しています。私が見たチュートリアルのほとんどは C に対応しており、私が見つけた最も近い質問 ( here ) は、私がそれをコンパイルしようとしたため、レンガの壁に私を置きますが、望ましい結果が得られません.どのように機能するかについては、まだしっかりしてextern "C"
いません。
これが終わるまでに、シンボルテーブルから変数にアクセスし、変数を変更できるようにしたいと考えています。私はnm
とobjdump
をいじりました (そして、ハードウェアのバックグラウンドから来ているので、見るのは間違いなくクールですdlsym
) dlopen
。何よりもCで)。
アドバイスやコードの小さなスニペット (独自のサンプル プログラムを作成できるようにするため) は素晴らしいものです。追加するために、これは一種の古いバージョンのG ++を備えたLinuxシステム上にあり(現在マシンにいないため、その情報がありません)、現在アップグレードするアクセス権がありません.
c - dlsym() 使用時のキャスト
私は in を使用dlsym()
しC
ていますが、の戻り値をdlsym()
明示的にキャストする必要があるのか、それとも暗黙的に正しくキャストするのかという質問があります。関数は次のとおりです。
この関数compile()
は値をとらず、double
入力として 2 つの を受け取り、double を返す関数へのポインターを返します。次に、共有オブジェクトをコンパイルするシステム コールを設定しますfoo.so
。次に、foo.so
で開きdlopen()
ます。次に、ヘッダーで次のように定義したタイプのオブジェクトをdlsym()
見つけfoo
て返します。foo.so
foo
キャストする必要がありdlsym()
ますか?
c - 適切なヘッダーを含めてコンパイルすると、シンボルがサフィックス「$UNIX2003」で破損する
私のコードが「システム」機能を実行するときにどのシンボルが呼び出されるかを知りたいです。
私のサンプル コードでは、ヘッダー stdlib.h が明確に含まれている場合、シンボルは _system$UNIX2003 と呼ばれ、ヘッダーが含まれていない場合、(おそらく) _system という名前の既定のシンボルがあります (サフィックス $UNIX2003 なし)。
次の図は、私の実験結果を示してい
ます。実行時に正しいシンボルを検出する方法はありますか (dlsym で試しましたが、動的ライブラリを格納するためのハンドルが必要ですが、dlopen でロードする必要があるライブラリではわかりませんでした) ?
EDIT : この奇妙なシンボルマングリングは、32 ビットアーキテクチャでコンパイルする場合にのみ発生します。
EDIT2: 暗黙の関数ポインタを使用して、正しいシンボルのアドレスを取得するよう提案されました。しかし、コードでその関数を具体的に呼び出さない限り、機能しません。そうしないと、宣言されていない識別子 'system' を使用しているというコンパイル エラーが発生します。
objective-c - dlsym を使用して Objective-C メソッドの関数ポインタを取得する方法
dlsym を使用して Objc メソッド シンボルをロードする例をオンラインで見つけることができません。
ただし、次のようなものを使用してクラスを取得できます
dlsym(handler, "OBJC_CLASS_$_CLLocationManager")
が、メソッドシンボルを取得する方法がわかりません。