Provided by:
manpages-ja-dev_0.5.0.0.20060115-1_all 
GNU張
glibc では POSIX には戯椶気譴討い覆ご愎瑤 2つ追加されている。
プロトタイプは以下の通りである。
#define _GNU_SOURCE
#include <dlfcn.h>
int dladdr(void *addr, Dl_info *info);
void *dlvsym(void *handle, char *symbol, char *version);
関数 dladdr() は、関数のポインタを引-
数にとり、関数の名前と関数が定義されている
ファイルの解決を試みる。情報は Dl_info 構造体に格納される。
typedef struct {
const char *dli_fname;/* File name of defining object */
void *dli_fbase; /* Load address of that object */
const char *dli_sname;/* Name of nearest lower symbol */
void *dli_saddr; /* Exact value of nearest symbol */
} Dl_info;
dladdr() は、エラー時には 0 を返し、成功した場合は 0 以外を返す。
関数 dlvsym() は dlsym()
と同じ動作をするが、バージョンの文字列を渡す引た瑤
追加されている点が異なる。
例
math2.0る
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("libm.so", RTLD_LAZY);
if (!handle) {
fprintf (stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
*(void **) (&cosine) = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
return 0;
}
このプログラムを "foo.c" に書いたとすると、以下のコマンドでプログラムを
ビルドでい襦
gcc -rdynamic -o foo foo.c -ldl
_init() と _fini() をエクスポートするライブラリの場合は
以下のようにしてコンパイルする必要がある。例として bar.c
をコンパイルする場合:
gcc -shared -nostartfiles -o bar bar.c
意
シンボル RTLD_DEFAULT と RTLD_NEXT は <dlfcn.h> で定義されており、
<dlfcn.h> のインクルード前に _GNU_SOURCE が定義されている場合のみ-
効となる。
史
dlopen インターフェースの標準は SunOS をもとにしている。 SunOS には
dladdr() もあったが、 dlvsym() はなかった。
拠
POSIX 1003.1-2003 には dlclose(), dlerror(), dlopen(), dlsym(). の-
載がある。
目
ld(1), ldd(1), dl_iterate_phdr(3), ld.so(8), ldconfig(8), ld.so info
pages, gcc info pages, ld info pages