从内存加载动态库

Load dynamic library from memory

本文关键字:动态 加载 内存      更新时间:2023-10-16

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

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

首先,我建议您使用OSX ABI动态加载器参考。

若要执行此操作,必须使用NSCreateObjectFileImageFromMemory API。

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

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

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

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

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

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

当调用此函数时,动态加载器在objectFileImage参数指向的内存上调用vm_deallocate/usr/include/mach/vm_map.h)。

请注意,尽管这些函数已被弃用,但(据我所知)使用建议的替代dlopen等。