6

是否可以从内存而不是从 mac/gcc 上的文件系统加载库?

对于 Windows,我使用的是 MemoryModule,但它显然不是跨平台兼容的。

4

1 回答 1

9

首先,要做到这一点,我建议您阅读OS X ABI Dynamic Loader Reference

为此,您必须使用NSCreateObjectFileImageFromMemory API。

给定一个指向内存中 Mach-O 文件的指针,该函数创建并返回一个NSObjectFileImage引用。当前实现仅适用于捆绑包,因此您必须使用-bundle链接器选项构建 Mach-O 可执行文件。

address指向的内存块必须用vm_allocate( /usr/include/mach/vm_map.h) 分配。

确保遵守vm_allocate用于包含模块的内存块的要求。

获取目标文件图像后,必须使用NSLinkModule函数将模块链接到程序中。

当您调用此函数时,给定模块引用的所有库都将添加到库搜索列表中。除非您通过NSLINKMODULE_OPTION_PRIVATE,NSLinkModule将模块中的所有全局符号添加到全局符号列表中。

链接后,不要忘记调用NSDestroyObjectFileImage函数进行清理。

调用此函数时,动态加载程序会在参数指向的内存上调用vm_deallocate( )。/usr/include/mach/vm_map.hobjectFileImage

dlopen请注意,虽然这些功能已被弃用,但使用建议的替代方法et没有替代品(据我所知) 。人。

于 2012-08-06T02:57:42.330 回答