你不需要特殊的圖書館獲得dlopen()
等在Mac OS X和共享對象.dylib
或.bundle
結束在Mac OS X
此代碼,沒有額外的庫編譯:
#include <dlfcn.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char *name = "libc.dylib";
if (argc > 1)
name = argv[1];
void *dlh = dlopen(name, 0);
if (dlh == 0)
printf("Failed to dlopen() %s\n", name);
else
printf("Got handle %p from dlopen() for %s\n", dlh, name);
dlclose(dlh);
return 0;
}
它運行並且產生:
Got handle 0x7fff624e9378 from dlopen() for libc.dylib
彙編:
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror dl.c -o dl
我在Mac OS X 10.9 Mavericks上使用GCC 4.8.2,但答案在任何版本的Mac OS X中仍然支持。
注意的ldd
在Mac OS X上的等價物是otool -L
,它產生:
$ otool -L dl
dl:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/usr/gcc/v4.8.2/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
$
我不知道什麼幕後的魔法詭計或意味着開放libc.dylib
實際上有效。但是:
$ ./dl libSystem.B.dylib
Got handle 0x7fff6e398378 from dlopen() for libSystem.B.dylib
$ ./dl
Got handle 0x7fff690d2378 from dlopen() for libc.dylib
$
這兩個地址是相同的,所以可能會有一些映射在幕後進行。