从内存加载动态库

时间:2012-08-06 02:44:02

标签: c++ macos gcc dll module

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

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

1 个答案:

答案 0 :(得分:6)

首先,为此,我建议您使用阅读OS X ABI Dynamic Loader Reference

为此,您必须使用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函数进行清理。

  

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

请注意,虽然不推荐使用这些函数,但使用建议的替代dlopen et无法替代(据我所知)。人。