4

Windows から Linux (実際には OS X) に DLL を移植しています。このStackOverflow の記事を使用して、その変更を行いました。

つまり、Windows の "bool DllMain()" を Linux の方法に移植しました。

__attribute__((constructor)) void dllLoad();

__attribute__((destructor)) void dllUnload();

...しかし、どちらも void 戻り型です。dlopen() が失敗して .so が読み込まれないように、コンストラクターで条件が満たされない場合は、Windows と同じようにして FALSE を返す必要があります。

dlopen() の呼び出しを失敗させるにはどうすればよいですか?

4

2 に答える 2

3

答えは、それは不可能です。上記のように、コンストラクターでエラーを出すことはできません-例外であろうとexit()であろうと

于 2013-03-25T15:50:34.173 に答える
1

これには別の方法でアプローチする必要があります。

ライブラリを動的にロードする場合は、GetProcAddress() と dlsym() を使用して実際に何かを行う必要があります。dlsym() は、ここで進むパスです。

そうしないと、これらの API をプラグインに追加することさえできないため、プラグインのコードを明確に制御します。したがって、どちらのプラットフォームでも「dllmain」が行う必要があるのは、グローバルな「有効な」状態情報を設定することだけです。次に、「ModuleIsValid()」のような既知の API を呼び出すだけです。その全体の仕事は、単にその状態情報を読み取って true/false を返すことです。false が返された場合は、ライブラリを閉じて失敗を報告します。

于 2015-02-20T21:22:07.787 に答える