問題タブ [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 - dlsymを使用しないLinuxでの関数の挿入
私は現在、いくつかのシステムコールと、、、などの低レベル関数の使用状況を追跡する必要があるプロジェクトに取り組んでmmap
いbrk
ますsbrk
。mmap
これまで、関数の介在を使用してこれを行ってきました。たとえば、置き換える関数と同じ名前のラッパー関数を記述し、LD_PRELOAD
環境変数を設定してプログラムにロードします。でロードするポインターを介して実際の関数を呼び出しますdlsym
。
残念ながら、ラップしたい関数の1つである、sbrk
は、によって内部的に使用されdlsym
ているため、シンボルをロードしようとするとプログラムがクラッシュします。sbrk
Linuxではシステムコールではないので、単にsyscall
間接的に呼び出すために使用することはできません。
だから私の質問は、使用せずに同じ名前のラッパー関数からライブラリ関数を呼び出すにはどうすればよいdlsym
ですか?元の関数を参照できるコンパイラのトリック(gccを使用)はありますか?
c++ - C++ での dlsym() および dlopen() の代替
一部で共有ライブラリを使用するアプリケーションがあります。これらのライブラリはコンパイル時にリンクされます。
実行時に、ローダーは共有オブジェクトが にあることを期待します。LD_LIBRARY_PATH
見つからない場合、アプリケーション全体が「共有ライブラリをロードできません」というエラーでクラッシュします。クライアントがライブラリを持っているという保証はないことに注意してください。適切なエラーメッセージを残すアプリケーションも、独立した部分が正しく機能するはずです。
この目的のために、私は共有ライブラリの API を使用していますdlsym()
。dlopen()
これに関する問題は、API に多くの関数がある場合、それらに個別にアクセスする必要dlsym()
があり、私の場合はメモリの破損とコードのクラッシュにつながる ptr を使用する必要があることです。
これに代わるものはありますか?
c++ - C の動的ロード ルーチンを使用する際の問題
C++ で記述されたさまざまなモジュールで構成されるアプリケーションがあります。
モジュールの 1 つは、SunGrid Engine で分散タスクを処理するためのものです。クライアントがグリッドをサポートしていない場合は、ローカル マシンを使用する必要が
あります API libdrmaa.so の共有オブジェクトは、コンパイル時にリンクされ、実行時にロードされます。
私のアプリケーションを使用しているクライアントがこの「.so」を持っている場合、すべて問題ありませんが、クライアントがそれを持っていない場合、アプリケーションは共有ライブラリのロードに失敗して終了します。
これを回避するために、API 呼び出しを dlsym() と dlopen() を使用して取得した関数ポインターに置き換えました。dlopen の呼び出しが成功せず、目的が達成された場合、グリッドの代わりにローカル マシンを使用できるようになりました。
現在の問題は、アプリケーションが小さなテストケースでは正常に実行されるようになったことですが、大きなテストケースではセグメンテーション エラーがスローされますが、動的読み込みを使用する同じコードは正しく機能します。
dlsym() と dlopen() を使用しているときに何か不足していますか?
同じ目標を達成する他の方法はありますか?
どんな助けでも大歓迎です。
ありがとう、
php - dlsymによるライブラリの介入
open()、close()、connect()などのlibc内のいくつかのライブラリ関数の使用状況を追跡するために、介入ライブラリを作成しています。これは、ほとんどのアプリケーションで一般的にうまく機能します。ただし、特にPHPのMySQLモジュールを使用してPHPで試してみると、このモジュール内のlibcへの関数呼び出しは追跡されません(したがって、connect()、socket()などはありません)。'strace'は、システムがsocket()、connect()などを呼び出すことを教えてくれました。モジュールとlibmysqlclient.so.16.0.0で「file」を実行すると、それらはすべて動的にリンクされていると言われました。したがって、静的リンケージによって引き起こされる問題ではないはずです。何が問題なのでしょう?
Fedora1164ビットバージョンを使用しています。
ありがとうございました。
c++ - dlopen/dlsym で使用すると、dynamic_cast が失敗する
はじめに
長い質問を前もってお詫び申し上げます。できる限り短くしていますが、残念ながらそれほど短くはありません。
設定
A と B の 2 つのインターフェイスを定義しました。
次に、クラス C のオブジェクトを構築し、A と B の両方を実装してから、それらの A インターフェイスへのポインタを渡す共有ライブラリ「testc」があります。
最後に、2 番目の共有ライブラリ「testd」があります。これは、A*
入力として を受け取り、それを にキャストしようとしますB*
。dynamic_cast
最後に、メイン アプリケーションA*
があり、ライブラリ間で 'sを渡します。
質問
「testc」および「testd」ライブラリにリンクしてメイン アプリケーションをビルドすると、すべてが期待どおりに機能します。ただし、「testc」および「testd」に対してリンクしないようにメイン アプリケーションを変更し、代わりにdlopen
/を使用して実行時にロードするとdlsym
、dynamic_cast
失敗します。
私はなぜなのか理解していない。手がかりはありますか?
追加情報
- gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) でテスト済み
- サンプルコードが利用可能
c++ - プロトタイプが不明な関数のC/C++動的ロード
私は一種のランタイムシステム/インタプリタを作成している最中です。実行できる必要があることの1つは、外部ライブラリにあるc /c++関数を呼び出すことです。
Linuxでは、dlfcn.h
関数を使用してライブラリを開き、その中にある関数を呼び出しています。問題は、dlsysm()
返された関数ポインタを使用する場合、呼び出される前に適切な型にキャストして、関数の引数と戻り型がわかるようにする必要があることです。ただし、ライブラリ内の任意の関数を呼び出す場合は、明らかにしません。コンパイル時にこのプロトタイプを知っています。
だから私が求めているのは、動的にロードされた関数を呼び出して引数を渡し、プロトタイプであることがわからなくても戻り値を取得する方法はありますか?
これまでのところ、これを行う簡単な方法はないという結論に達しましたが、私が見つけたいくつかの回避策は次のとおりです。
ロードしたいすべての関数が同じプロトタイプを持っていることを確認し、これらの関数がパラメーターと戻り値を取得するためのソートメカニズムを提供します。これは私が現在行っていることです。
インラインasmを使用して、パラメーターをスタックにプッシュし、戻り値を読み取ります。可能であれば、これを避けたいと思います。
誰かが何かアイデアを持っているなら、それは大いにありがたいです。
編集:
私は今、私が探していたものを正確に見つけました:
「ポータブルForeignFunctionインターフェイスライブラリ」
(私は元の質問でより明確であったかもしれないことを認めますが!)
c++ - dlsym を使用する Ansi C パッチは、Linux では正常にコンパイルされますが、Mac Os X では失敗します
特定のアプリケーションに追加し、いくつかの関数の呼び出しを追跡するための小さなパッチを作成しました。その中には、malloc() と open() があります。dlsym を使用して元のシンボルへのポインターを格納し、関数名を独自のものに置き換えています。Linux で完全にコンパイルされ、動作します。コードは次のとおりです。
次に、次の命令でコンパイルし、pi.so を作成します。
次に、LD_PRELOAD ディレクティブを使用して、任意のアプリに挿入します。
そして、それは Linux で素晴らしい働きをします! しかし、家に帰って Mac で GCC を使用してコンパイルしようとすると、コンパイルに失敗し、LD_PRELOAd ディレクティブが機能しません。何を変更すればよいですか?どうもありがとうございました。
c++ - ライブラリを LD_PRELOAD に設定すると、一部のプロセスでローダー エラーが発生する
実行アクセス権しかないスクリプトを実行しようとすると、次のエラーが発生します。
uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym
これは、LD_PRELOAD
環境変数を に設定した後/home/dumindara/random/sotest/a.out
です。
a.out
テスト機能を持ち、内部的malloc
に呼び出します。dlsym
実行中はこの問題は発生しませんls
。ほとんどのプロセスでこのエラーが発生します。なぜこれが起こるのですか?それを機能させるにはどうすればよいですか?
c++ - 動的にロードされた関数 (dlopen) でデータを操作/返す方法は?
この件に関して見つけたすべてのチュートリアルを何日も読んで読み直し、SO で関連する質問を何時間も (さらには何日も) 閲覧しましたが、まだ次のことを行うことができません。これが重複している場合は、申し訳ありません。重複した質問を何度も見て再読した可能性がありますが、私の問題に対する回答の関連性を理解できませんでした。それはさておき...
アプリケーションにプラグイン アーキテクチャを実装しようとしています。プラグインはコンパイルされ、ライブラリとしてインストールされます。実行時に、アプリケーションは dlopen() / dlsym() を使用して、プラグインの関数をロードおよびリンクします。
プラグイン (ライブラリ) が一連の関数を実装して、データをメインのアプリケーションに返したり、アプリケーションから渡されたデータを操作したりするという考え方です。
このアイデアをテストするために、プラグイン自体の (人間が読める) 名前を (std::string として) 返す関数を (プラグイン内に) 実装しようとしました。簡単に始められると思いました.... :-/
これが私がこれまでに得たものです:
プラグイン名が返される、より単純に見える(しかしうまく機能しなかった)ものを含め、さまざまな組み合わせを試しました。
コードがコンパイルされ、アプリケーションがクラッシュしなくなりました ;)
しかし、実際のプラグイン名が表示されるはずの場所に空白があります。
これまでに読んだすべてのチュートリアルでは、データが双方向に渡されるメカニズムについて非常に簡単に説明しています: プラグイン <=> アプリケーション。「単純な」 std::string でやろうとしていることは、後でもっと複雑なオブジェクトでやりたいと思います (つまり、プラグイン関数は参照によってオブジェクトを取得し、そのプロパティの一部を変更します)。チュートリアルは多かれ少なかれすべて dlsym() を使用してポインターを作成する時点で停止し、このポインターの使用方法について多くの例を示していません。
それで、それをすべて行う方法は?
別の関連する質問: アプリケーションとプラグインの両方で使用する共通ヘッダーを使用する必要がありますか? 関数呼び出しの署名を定義する場所はどこですか? どうすればこれを行うことができ、それはどのように役立ちますか?
ios - iOSでdlsymを使用して名前で関数を呼び出す
iOS で関数を名前で呼び出すことはできませんか? というC関数がありgetstring
ます。私は次のように呼んでいます。
これが実行されると、responseFiled.text
に設定されdlsym(...): symbol not found
ます。これは、機能するdlopen
が機能しないことを意味しdlsym
ます。バイナリを使用してシンボルをダンプし、存在するnm
ことを確認しました_getstring
。のマニュアルを確認したdlsym
ところ、名前にアンダースコアを追加してはいけないと書かれています。とにかく追加しても問題は解決しません。私は何を間違っていますか?
ここで、Objective-C で関数を名前で呼び出すことについて同様の質問をし、回答に従って Mac で正常に実行したため、この問題は iOS に固有のようです。