問題タブ [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 に答える
858 参照

c++ - この動的ライブラリ読み込みコードが gcc で動作するのはなぜですか?

バックグラウンド:

私は、C++ GNU/Linux アプリケーションを Windows に移植するという、うらやましい仕事をしていることに気づきました。このアプリケーションが行うことの 1 つは、特定のパスで共有ライブラリを検索し、posix dlopen() および dlsym() 呼び出しを使用してそれらからクラスを動的にロードすることです。このようにロードするのには十分な理由がありますが、ここでは触れません。

問題:

dlsym() または GetProcAddress() を使用して C++ コンパイラによって生成されたシンボルを動的に検出するには、extern "C" リンケージ ブロックを使用してシンボルをアンマングルする必要があります。例えば:

このコードは完全に有効な C++ であり、Linux と Windows の両方の多数のコンパイラでコンパイルおよび実行されます。ただし、「戻り値の型が有効な C ではない」ため、MSVC ではコンパイルされません。私たちが思いついた回避策は、リスト オブジェクトの代わりにリストへのポインターを返すように関数を変更することです。

私は、新しい関数と古いレガシー関数プロトタイプの両方で動作するか、少なくとも非推奨の関数が検出されたときに検出して警告を発する、GNU/Linux ローダーの最適なソリューションを見つけようとしています。古いライブラリを使用しようとしたときにコードがセグメンテーション違反を起こした場合、ユーザーにとって見苦しいものになります。私の最初のアイデアは、get_list の呼び出し中に SIGSEGV シグナル ハンドラーを設定することでした (これが厄介なのはわかっています。より良いアイデアを受け入れます)。したがって、古いライブラリをロードするとセグメンテーション違反が発生することを確認するために、古い関数プロトタイプ (リスト オブジェクトを返す) を使用して新しいロード コード (リストへのポインタを期待する) を使用してライブラリを実行し、驚いたことにそれを実行しました。ちょうど働いた。私が持っている質問は、なぜですか?

以下の読み込みコードは、上記の両方の関数プロトタイプで動作します。gcc バージョン 4.1.2 および 4.4.4 を使用して、Fedora 12、RedHat 5.5、および RedHawk 5.1 で動作することを確認しました。-shared および -fPIC を指定して g++ を使用してライブラリをコンパイルし、実行可能ファイルを dl (-ldl) に対してリンクする必要があります。

0 投票する
5 に答える
5797 参照

c++ - シンボルが削除されているかどうかを実行時に検出する方法は?

私の C++ プログラムでは、Linux の 'strip' gnu 開発ツールを使用してシンボルが削除されたかどうかを実行時にプログラムで検出するにはどうすればよいですか?

削除された場合は true、そうでない場合は false を返す関数定義が必要です。

「main()」で dlsym() を使用すると、これを確実に検出できますか?

0 投票する
2 に答える
1431 参照

c - C --> malloc --> dlsym

dlsym()デフォルトのライブラリ malloc の代わりに、自分のバージョンの malloc を呼び出していました。

一定時間後、タイマーかそこらかもしれませんが、元のバージョンのmalloc(libcライブラリmalloc)に戻したいと思います。どうやってやるの?

前もって感謝します。

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

c - モジュールをロードするためのこの単純な C テスト プログラムを動作させるにはどうすればよいですか?

Linux で dlopen と dlsym を使用して、次の 2 つのソース ファイルを機能させます。

と:

しかし、最初のものをコンパイルすると、次のように言い続けます:

main.c:9: エラー: 代入の左オペランドとして左辺値が必要です

編集: キャストを追加して、それを関数ポインターにしようとしましたが、今では次のように表示されます: main.c:(.text+0x1f): dlopen' main.c:(.text+0x2b): undefined reference todlsym への未定義の参照'

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

dlsym - 名前付きのエクスポートされていないシンボルを dlsym でロードしますか?

を使用してフレームワークから名前付きのエクスポートされていないシンボルをロードすることは可能dlsymですか?

インポートしようとしているシンボルには、フレームワーク内で参照される名前があります。それは私が呼び出す必要がある関数です。

dlopen+通常のdlsym方法で実行しようとしていますが、エクスポートされていないシンボルをロードしようとするとdlsymNULLポインターが返されます。

0 投票する
2 に答える
1103 参照

c++ - C++ のファクトリ パターン: 明示的な createInstance() メソッドを自動的に生成する

私はC++フレームワークを書く際に問題があり、ユーザーはそれを使用できるよりもオーバーヘッドが少ないはずです。ユーザーは、フレームワークの BaseClass から派生したクラスを含む共有ライブラリを作成し、その派生クラスのインスタンスを返すために extern "C" createInstance() メソッドを実装することで、自分の作業をフレームワークに公開できます。したがって、フレームワークは、dlsym() を使用して共有ライブラリを介して createInstance-Method を呼び出すことにより、ユーザー クラスにアクセスできます。

フレームワーク:

私の質問: ユーザーが考える必要がないように、各ユーザー ライブラリで冗長な UserXcreateInstance() メソッドを生成することは可能ですか?

テンプレート+マクロで可能だと思っていましたが、これを行う方法はまだ見つかりません...

別のアプローチとして、dlsym と適切な名前マングリングを介して任意のユーザー クラスのコンストラクターを直接呼び出すことを考えていました。(構成ファイルから名前空間とクラス名を知っています)しかし、これが適切な解決策だとは思いません。特に、コンストラクター呼び出しは通常の関数呼び出しと同じではありません...しかし非常に興味深い...

0 投票する
2 に答える
2268 参照

linux - 削除されたバイナリ ライブラリから dlsym が関数を正常にインポートするにはどうすればよいですか?

dlsym がストリップされたバイナリから関数をインポートできるのは奇妙です。

誰でも理由/方法を教えてもらえますか?

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

c - dlsym: 異なるサイズの整数からポインタにキャスト

ここで質問するのは本当に嫌です。しかし、私は他のいくつかの投稿を見てきましたが、このような解決策はうまくいかないようです. おそらく私の構文の誤解です。

私は私の古いコードを改善しています。質問の関数は、いくつかのロードされたモジュールを循環し、関数を実行します。このコードは、私が x86 を使用していたときは完全に機能していましたが、64 ビットに移行するとすべてが台無しになります。

次の警告が表示されます。

そしてもちろん、私のプログラムのセグメンテーション違反。これはキャスティングの問題であることはわかっていますが、簡単でポータブルな解決策はわかりません。さらに情報が必要な場合は、お知らせください。ありがとう。

0 投票する
2 に答える
765 参照

c - Swig を使用して C と TCL を組み合わせる

Swigを使用してCとTCLを組み合わせるチュートリアルに従っています。チュートリアルは適切に機能しているように見えましたが、最後に解決できないエラーに遭遇しました。状況は次のとおりです。

私がフォローしていたチュートリアルは http://www.swig.org/tutorial.htmlです。

test.c という名前のファイルがあります。

および別の名前の test.i:

次に、次のコマンド ライン引数を使用して、正しいファイルを準備しました。

そして最後に、次を使用してロードしようとしました:

これは、次のエラーを受け取ったポイントです。

私の知る限り、私はチュートリアルから外れていません。このエラーが発生した理由と、さらに重要なことに、それを取り除く方法を誰か教えてもらえますか?

前もって感謝します!

0 投票する
0 に答える
288 参照

mmap - mmapの追跡にdlsymを使用する

私はいくつかのプログラムmmapsがどれだけのメモリを実行するかを測定しようとしています。私は次のコードを使用しています:

statsは、統計を保存するグローバル変数です。このコードを共有オブジェクトに変換してリンクします。一部のプログラムでは機能しますが、一部のプログラムでは、mmap1で一度印刷され、次にmmap1で再度印刷され、その後何も起こりません(プログラムは、この時点で、mmap2に到達することなく、強制終了するまでスタックします。

dlsymについて読みましたが、これを引き起こしている問題を見つけることができません。もっと経験豊富な人からここに行きたいです。ありがとう。