在 Mac OS X 上,您不需要特殊的库来获取 dlopen() 等。在 Mac OS X 上,共享对象以 .dylib 或 .bundle 结尾。
此代码无需额外库即可编译:
#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 版本上答案都是一样的。
请注意,Mac OS X 上 ldd 的等价物是 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
$
两者的地址相同,因此可能在幕后进行了一些映射。