2016-09-04 2 views
0

上の共有ライブラリをロード中に常に共有オブジェクト内の関数またはシンボルを解決しなければならないの私たちは、実行時に共有ライブラリをロードする必要がある場合、それはそうHow to load a dynamic library on demand from a C++ function/Qt methodは、なぜ私たちは、ランタイム

を通り抜けました。 How to load a dynamic library on demand from a C++ function/Qt method

に提案されているように我々は常に我々が

2 .OR

をdlopenを使用して、実行時に共有ライブラリをロードする場合)、

1)dlsymをを使用して他の技術を共有オブジェクト内の関数/シンボル名を解決するためにコードを書きます

3)私の共有ライブラリが私の共有ライブラリが機能

FUN1()、fun2を持っ例えばシンボル/機能の何百万を持っていますので..... fun1000000

はどこ任意の直接的な方法があります関数/シンボル名を解決するコードを記述する必要はなく、共有ライブラリをロードした直後に関数を共有ライブラリ関数から直接呼び出すだけです。あなたが直接そのようなシンボルが呼び出し可能にする場合は、私が

void loadSharedObject() { 
    //load the 
    // Call the function names directly 
    // no extra code for resolving the function /symbols names 
    // for example 
    fun1() 
    fun2() 
} 
+0

ライブラリーに 'QObject'が組み込まれている場合は、そのメタオブジェクトを使ってその機能を取得して呼び出すことができます。それ以外の場合は、ELF構造体(Linuxではreadelf)を解析し、dlsymを使用する必要があります(これは面倒なことかもしれません)。 –

+0

なぜあなたはそれについて気にしていますか?どのような問題を解決しようとしていますか?他の誰かが一見して戦っていない上り坂と戦っているように見えますが、それはあなたにどんな鐘も鳴らしませんか?あなたはあまりにも頑張っています。それは不要です。 –

答えて

0

を探しています

アルゴリズムは、あなただけの普通のリンクをやっています。これが通常のリンクが可能にするものです。ライブラリーを動的にロードすると、リンクステージの後にシンボルを発見することができます。時には非常にが便利ですが、プログラムを読み込んでシンボルを直接話すことができません。代わりに、dlopen()dlsym()を実行してライブラリを開き、その中のシンボルへの参照を取得する必要がありますが、参照は生のポインタに過ぎません。適切なシグネチャを持つ関数ポインタに変換するために正しいキャストを適用する必要があります。関数ポインタを使用して関数ポインタを呼び出すことができます。

は( - LoadLibraryEx()GetProcAddress() - Windowsは異なるAPIを使用していますが、彼らは一般的なものは同じです。)

あなたはローカルまたはファイル・ローカル変数でシンボル参照を保存することができます。それがうまくいけば、という名前のシンボルは、ローカルでと名前を付けているので、他のどの関数でも呼び出すことができます。関数の型シグネチャを定義するには、おそらくtypedefを使用します。関数型はCとC++では少し醜いです。 dlopen()dlsym()が働いていたか何かが失敗した場合は、ハードクラッシュを得るでしょうか次のコードは、エラー処理を欠いており、特に

、あなた必見チェック。

typedef int (thefunc_t)(int x, int y); 

void *handle = dlopen(libraryname, RTLD_LOCAL); 
void *sym = dlsym(handle, "thefunc"); 
thefunc_t *thefunc = reinterpret_cast<thefunc_t *>(sym); 

// Now, assuming everything worked, you can just call it like this: 
int z = thefunc(1, 2); 
+0

はい、それらの配列を作ることができます。それは厳しくない。しかし、あなたがロードしているコードは、 'extern" Cの関数名を使い分ける必要があります。 –

+0

共有ライブラリにリンクして実行ファイルを実行すると、共有ライブラリのシンボルがどのように解決され、共有ライブラリのシンボルを解決するためのシステムコールはどうなるでしょうか?また、リンカーがどのようにローダーを動作させるのかを私に指摘することができれば役に立ちます。リンカーが共有ライブラリを作成するときにシンボルがどのように解決されるか – TechEnthusiast

関連する問題