リンカーだけでこれを達成できるとは思いませんが、C のコードで何かを動作させることができるかもしれません。
問題は、既にロードされているライブラリをロードする呼び出しが、新しいコピーをロードする代わりに、既にロードされているインスタンスへの参照を返すことです。dlopenとLoadLibraryのドキュメントをざっと見てみると、少なくともイメージを実行する準備をしたい場合は、同じライブラリを複数回ロードする方法がないことが確認されているようです。これを回避する 1 つの方法は、OS が同じライブラリであることを認識しないようにすることです。これを行うには、ファイルのコピーを作成できます。
いくつかの疑似コード。 への呼び出しを へsleeping_function
の呼び出しに置き換えるだけcall_sleeping_function_thread_safe
です。
char *shared_lib_name
void sleeping_function_thread_init(char *lib_name);
void call_sleeping_function_thread_safe()
{
void *lib_handle;
pthread_t pthread;
new_file_name = make_copy_of_file(shared_lib_name);
pthread_create(&pthread, NULL, sleeping_function_thread_init, new_file_name);
}
void sleeping_function_thread_init(char *lib_name)
{
void *lib_handle;
void (*)() sleeping_function;
lib_handle = dlopen(lib_name, RTLD_LOCAL);
sleeping_function = dlsym(lib_handle, "sleeping_function")
while (...)
sleeping_function;
dlclose(lib_handle);
delete_file(lib_name);
}
Windows の場合は、次のようになりdlopen
ます。ただし、基本的な考え方は引き続き機能します。LoadLibrary
dlsym
GetProcAddress