問題タブ [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.

0 投票する
1 に答える
553 参照

c - 共有ライブラリへのC動的リンクは、「共有オブジェクトファイルを開けません」という致命的なエラーを抑制/処理し、リンクを続行します

C で共有ライブラリにリンクしたい (Linux の場合)

以下を抑制または処理したい:

「共有ライブラリの読み込み中にエラーが発生しました: libxxxx.so: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません」

残りの未解決のシンボルを解決する可能性のある次のライブラリへのリンクをロードし続けます。

gcc/ld/dlsym オプションを使用する必要があると思いますが、その方法を理解できません...

誰も手がかりを持っていますか?

0 投票する
1 に答える
1237 参照

c - 関数プロトタイプ dlsym の C typedef

共有ライブラリを LD_PRELOAD に書き込んでおり、既存のライブラリ (Linux) からのいくつかの呼び出しをインターセプトしています。

約 50 以上の異なる関数プロトタイプと属性宣言を記述する必要があります。関数プロトタイプは非常に大きいため、コードをできるだけ短くしたいと考えています。

私が抱えている問題は次のとおりです: doStuff(int, void*) へのすべての呼び出しを傍受したいとしましょう

次のコードがあります。

ヘッダー ファイル:

Cファイル

これで問題なく動作しますが、ヘッダーの次の行を置き換えたいと思います。

次のようなもので:

しかし、私は得る

「doStuff」が別の種類のシンボルとして再宣言されました

実際のライブラリで宣言されているため...しかし...現在の構文には問題はありません...引数を最初から書き直さなければなりません...型定義から逆参照を外すと:

その後extern doStuffPrototype doStuff;、動作しますが、dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");コンパイルされません...

私は多くのことを試しました:これは可能ですか?

0 投票する
1 に答える
1559 参照

c++ - so ファイルを dlsym で読み込んでいますが、ライブラリを読み込めません

.so ファイルからプラグインをロードする API を実装しています。それらをロードするには、dlsym() 関数を使用しています。機能するかどうかを確認するために、テスト プラグイン (以下) を実装しました。簡単にするために、「初期化」関数のみをロードしています。コードをコンパイルするには、まず次のコマンドで .so ファイルを作成します。

その後、次のように plugin_manager.cpp を実行します。

しかし、a.out を実行して正しいファイル名を入力すると、.so ファイルを読み込めないというエラーが表示されます。この問題を解決する方法について手がかりを持っている人はいますか?

plugin_manager.cpp

plugin_interface.h

test_plugin.cpp

0 投票する
1 に答える
3502 参照

c++ - オブジェクトファイルのシンボルを実行可能ファイルの動的シンボルにする

ビルド システムから吐き出される (C++ からの) オブジェクト ファイルがいくつかあります。それらextern "C"には、プログラムで使用したいいくつかのリンケージシンボルがあり、dlopen/を介しdlsymて他の場所からアクセスできます。

gcc を使用して実行可能ファイルにコンパイルすると、これらのシンボルは使用リストに表示されませんnm -D <executable-here>(つまり、これらは動的シンボルではありません)。

コンパイルされた実行可能ファイル内で動的シンボルとして公開されるようにするにはどうすればよいですか?

オブジェクト ファイルと実行可能ファイルのビルド フラグを変更することはできますが、C++ ファイルを最終的な実行可能ファイルにする方法を変更する (つまり、最初にオブジェクト ファイルにしない) のは困難です。

(GCC 4.8、ld 2.24)

編集:私はこの質問に出くわしました. 静的バイナリで dlsym を使用する

0 投票する
1 に答える
464 参照

c - LibCURL の動的リンク中にエラーが発生しました

libcurl を動的にリンクしようとしていますが、easy_performing のときに Segfault が発生します。
グローバルスコープ宣言は次のとおりです。

次に、動的にリンクしました:

この時点で終了または失敗しません。
というわけで、ここからショーが始まります。このようにcurloptsを設定すると、エラーは発生しませんでした:

しかし、easy_performing のときに segfault が発生しました:

エラーは簡単に実行できると確信していますが、先に進んでcore_dumpを生成することにしました。このコアを gdb すると、実際には easy_init でエラーが発生しました。

プログラムはシグナル 11、セグメンテーション違反で終了しました。curlapp からの curl_easy_init () の #0 0x00007f3d2f9cd3f8

ここで何が間違っているのか、誰にも考えがありますか?

前もって感謝します!


[編集]

curl_easy_perform ブロックを削除すると、プログラムは正常に実行されます。curl_easy_perform() が原因で失敗したのか、それとも単にこの関数で問題が発生したのかはわかりません。つまり、「init」と「setopts」が easy_perform にのみ適用されることを意味します。(あくまで推測です)

[編集2]

変更された dlsym ブロック:

関数呼び出しでは:

しかし、まだ curl_easy_init() で Segfault が発生しています。
誰かが私を助けることができますか?