问题描述
根据macOS Big Sur 11.0.1 Release Notes:
macOS Big Sur 11.0.1 中的新功能,系统附带内置动态 所有系统提供的库的链接器缓存。作为这一变化的一部分, 文件系统上不再存在动态库的副本。 尝试通过查看来检查动态库是否存在的代码 对于路径中的文件或枚举目录将失败。反而, 通过尝试 dlopen() 路径检查库是否存在 将正确检查缓存中的库。
我使用的是 M1 macOS Big Sur 11.1,/usr/lib/libssl.dylib
中没有文件:
$ ls /usr/lib/libssl.dylib
ls: /usr/lib/libssl.dylib: No such file or directory
所以我假设 libssl.dylib
在链接器缓存中,但是
这个简单的程序:
#include <dlfcn.h>
#include <stdio.h>
int main() {
printf("Calling dlopen()..\n");
void* handle = dlopen("/usr/lib/libssl.dylib",RTLD_Now );
if (handle == NULL) {
fprintf(stderr,"Could not open libssl.dylib: %s\n",dlerror());
return 1;
}
if (dlclose(handle) != 0) {
fprintf(stderr,"Could not close libssl.dylib: %s\n",dlerror());
return 1;
}
printf("Success!\n");
return 0;
}
编译
cc -g -o test_load load.c -ldl
崩溃:
$ ./test_load
Calling dlopen()..
WARNING: /Users/hakonhaegland/test/test_load is loading libcrypto in an unsafe way
[1] 9364 abort ./test_load
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)