実行可能ファイルを他の共有オブジェクトに「オプションで依存」させたいと考えています。したがって、DSO が存在しない場合は、一部のシンボルなしで実行できます。
呼び出しでこれを実現できdlopen/dlsym
ますが、各シンボルを手動でロードし、次のようにラッパーを追加する必要があります。
void *my_lib = dlopen("my_lib.so", RTLD_LAZY);
if (!my_lib) {
// ok, I promise not to touch my_lib symbols
} else {
my_foo_ptr = dlsym(my_lib, "my_foo");
my_bar_ptr = dlsym(my_lib, "my_bar");
}
... my_foo(...) {
assert(my_foo_ptr);
return (*my_foo_ptr)(...);
}
... my_bar(...) {
assert(my_foo_ptr);
return (*my_bar_ptr)(...);
}
これはばかげたコードであり、「my_lib.so」ABI に直接依存しているため、ライブラリが更新されるたびに更新する必要があります。
私はこれを行う方法を探してld.so
います。したがって、理想は次のようになります。
void *my_lib = dlopen("my_lib.so", /* bring me all my symbols */);
if (!my_lib) {
// ok, I promise not to touch my_lib symbols
} else {
// ok, I can directly call symbols from my_lib.so
my_foo();
my_bar();
}
しかし、これには 2 つの疑問があり
ます。1. アプリのリンク段階でこれらのシンボルをどうするか? my_lib.so に明示的にリンクすると、アプリはそれに厳密に依存するため、my_lib.so がないと起動できなくなります。そうでない場合は、ld
未定義のシンボルについて文句を言います。
2.dlopen()
すべての my_lib.so シンボルをアプリで使用できるようにする方法を教えてください。
Upd: マークを付けずに共有ライブラリと明示的にリンクするとうまくいくことに気付きましたDT_NEEDED
。しかし、これを行う方法がわかりませld
ん。