在macOS上对C 库进行动态链接
我有一个C 解释器,想在现代macOS下重新让它工作。我想使用 dlopen() 打开C 库的.dylib文件,这样就可以动态调用像 printf() 这样的函数。
从前这工作得挺顺。可是,苹果已经把系统dylibs移到共享缓存中,意味着我曾经能够 dlopen() 的文件,例如 System.dylib,现在已经不再以原样存在。(它们已经被 小文本文件 取代,像 System.tbd,它们扮演着指向被缓存的、共享的.dylib文件的一种索引的角色。)
在现代macOS上有办法做到吗?是否可以在共享缓存上调用 dlopen()(或某个Mac专用的 dlopen() 变体)?是否可能从共享缓存中提取出单独的 .dylib 文件?有人知道共享dylib缓存文件是什么、在哪儿吗?
除此之外,我可能得自己创建一个C 库 .dylib 文件,方法是写一个桩程序,调用C 库里的每个函数,然后找办法把它链接到一个dylib,使得所有库函数的代码都进入其中。
解决方案
尽管这些文件其实并不存在,运行时链接器似乎仍然能够处理它们。以下内容在macOS Tahoe 26.5.1上按预期工作:
#include <dlfcn.h>
int main() {
void* handle = dlopen("/usr/lib/libSystem.B.dylib", RTLD_NOW);
void* (*printf_)();
*(void**)(&printf_) = dlsym(handle, "printf");
printf_("hello world\n");
return 0;
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。