標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Single UNIX Specification、バージョン 3 |
両方 | z/OS® V1R6 |
#define _UNIX03_SOURCE
#include <dlfcn.h>
void *dlsym(void *__restrict__ handle, const char *__restrict__ name);
dlopen() 呼び出しを使ってアクセス可能にされたダイナミック・リンク・ライ ブラリー (DLL) 内で定義されたシンボルのアドレスを入手します。 handle 引数は、dlopen() の呼び出しから戻された値であって (dlopen() が dlclose() 呼び出しによって解放されていない場合)、name はシンボルの名前 であって文字ストリングです。
dlopen() によってロードされた DLL は、指定されたシンボルが検索されます。 そのシンボルがその DLL で見つからない場合、その DLL の従属 DLL が検索され、 さらにその従属 DLL に従属する DLL が検索され、指定されたシンボルが見つかるか、 または全従属 DLL の検索が終わるまで、幅優先方式で検索が続けられます。 この検索順によって、異なる DLL 内の重複したシンボルがどのように見つかるかが 決まります。ただし、同じレベルの異なる従属 DLL が検索される順は不定です。
また、dlsym() による従属 DLL の検索は、ロードされていない従属 DLL をロード しないことに注意してください。 dlopen() の呼び出しの一部としてロードされた従属 DLL が検索されるだけです。 dlsym() の以降の呼び出しで従属 DLL の全セットが使用可能になっている必要が ある場合、RTLD_NOW ロード・フラグを呼び出して DLL をオープンしてくださ い。 RTLD_LAZY が指定されると、どの従属 DLL がロードされるかは不定です。
この唯一の例外は、dlopen(NULL,0) 呼び出しで入手されるグロ ーバル・シンボル・オブジェクトであって、この場合には、すべて の DLL (RTLD_LOCAL を指定してオープンされた DLL を除く) は、それらがロ ードされた順に検索されます。
void *handle;
int *iptr, (*fptr)(int);
/* open the needed object */
handle = dlopen("/usr/home/me/libfoo.so", RTLD_LOCAL | RTLD_LAZY);
/* find the address of function and data objects */
fptr = (int (*)(int))dlsym(handle, "my_function");
iptr = (int *)dlsym(handle, "my_object");
/* invoke function, passing value of integer as a parameter */
(*fptr)(*iptr);