アプリケーションは、実行中に他の共用オブジェクトにバインドして、アドレス空間を拡張できます。このような共用オブジェクトの遅延バインディングには、次のような長所があります。
アプリケーションの初期化中ではなく、必要なときに共用オブジェクトを処理すると、起動時間を大幅に短縮できる。また、ヘルプやデバッグ情報を含むオブジェクトなどのアプリケーションを実行する場合には、共用オブジェクトが不要になることもある。
アプリケーションでは、ネットワークプロトコルなど、必要なサービスだけを多数の異なる共用オブジェクトから選択できる。
実行中にプロセスのアドレス空間に追加された共用オブジェクトを使用後に解放できる。
アプリケーションが追加の共用オブジェクトにアクセスする場合の典型的な例は次のとおりです。
dlopen(3DL) を使用して共用オブジェクトを配置し、実行中のアプリケーションのアドレス空間に追加する。共有オブジェクトの依存関係も、この時点で見つけて追加する。たとえば、次のようになる。
#include <stdio.h>
#include <dlfcn.h>
main(int argc, char ** argv)
{
void * handle;
.....
if ((handle = dlopen("foo.so.1", RTLD_LAZY)) == NULL) {
(void) printf("dlopen: %s¥n", dlerror());
exit (1);
}
.....
|
追加した共用オブジェクト (1 つまたは複数) は再配置され、新しい共用オブジェクト (1 つまたは複数) 内の初期化セクションが呼び出される。
アプリケーションは dlsym(3DL) を使用して、追加された共用オブジェクト (1 つまたは複数) 内でシンボルの位置を見つける。これにより、アプリケーションはこの新しいシンボルで定義されたデータを参照したり、関数を呼び出したりできる。上記の例の続きは次のようになる。
if (((fptr = (int (*)())dlsym(handle, "foo")) == NULL) ||
((dptr = (int *)dlsym(handle, "bar")) == NULL)) {
(void) printf("dlsym: %s¥n", dlerror());
exit (1);
}
|
アプリケーションが共用オブジェクト (1 つまたは複数) の使用を終了すると、dlclose(3DL) を使用してアドレス空間が解放される。解放される共用オブジェクト (1 つまたは複数) 内の終了セクションが、この時点で呼び出される。たとえば、次のようになる。
if (dlcose (handle) != 0) {
(void) printf("dlclose: %s¥n", dlerror());
exit (1);
}
|
これらの実行時リンカインタフェースルーチンを使用した結果として発生するエラー状態は、dlerror(3DL) を使用して表示できる。
実行時リンカのサービスは、ヘッダファイル <dlfcn.h> 内で定義されていて、共用ライブラリ libdl.so.1 を介してアプリケーションで利用できます。たとえば、次のようになります。
$ cc -o prog main.c -ldl |
この場合、ファイル main.c は dlopen(3DL) ファミリの任意のルーチンを参照でき、アプリケーション prog は実行時にこれらのルーチンにバインドされます。
アプリケーションが指定する実行時リンクの詳細は、『リンカーとライブラリ』を参照してください。使用方法については、dladdr(3DL), dlclose(3DL)、dlerror(3DL)、dlopen(3DL)、dlsym(3DL) の各マニュアルページを参照してください。