デバッグ ライブラリと同じ C API を持つ別の「実際の」共有ライブラリを呼び出す「デバッグ」共有ライブラリ (.so または .dll ファイル) を作成しようとしています (この場合、PKCS# をエミュレートするため)。 11 API)。しかし、デバッグ ライブラリのリンク マップが実際のライブラリのリンク マップと衝突し、デバッグ ライブラリが実際のライブラリの対応する関数ではなく独自の関数を呼び出すという問題が発生しています。POSIX dlmopen コマンドを使用してこの問題の解決策を見つけましたが、GNU の libtool を使用して同じことが可能かどうかを知りたいです。
私の Solaris 10 システムでは、テスト アプリケーションがデバッグ ライブラリに静的にリンクしている場合、次のコードはアサーションに失敗します。
#include <dlfcn.h>
int MyFunctionName() {
int (*function_ptr)();
void *handle = dlopen("realsharedlibrary.so", RTDL_LAZY);
*(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
ASSERT(function_ptr != MyFunctionName); // Fails
return (*function_ptr)();
}
この場合、実際の共有ライブラリ内の MyFunctionName ではなく、ローカルの 'MyFunctionName' (デバッグ ライブラリ内) への関数ポインタを取得します。
LM_ID_NEWLM
「dlopen」の代わりに「dlmopen」コマンドを使用し、実際のライブラリをロードするときに(パラメーターを使用して) 新しいリンク マップを作成するように dlmopen に指示することで、この問題を回避できることがわかりました。
int MyFunctionName() {
int (*function_ptr)();
void *handle = dlmopen(LM_ID_NEWLM, "realsharedlibrary.so", RTDL_LAZY);
*(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
ASSERT(function_ptr != MyFunctionName); // succeeds
return function_ptr(); // call real function
}
残念ながら、dlmopen は libtool に含まれていないようです (つまり、libtool に lt_dlmopen 関数がありません)。
libtool コマンドを使用して同じことを行うことは可能ですか?つまり、新しいライブラリをロードするときに新しいリンク マップを作成して、デバッグ ライブラリのリンク マップと衝突しないようにすることはできますか?