【问题标题】:Load dynamic library from memory从内存中加载动态库
【发布时间】:2012-08-03 01:12:58
【问题描述】:

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

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

【问题讨论】:

  • dlopen from memory?的可能重复
  • @JonathonReinhart - 不完全是。那是在询问如何“破解”dlopen特别是)从内存中加载。我想知道其他任何可能的方法。

标签: c++ macos gcc dll module


【解决方案1】:

首先,要做到这一点,我建议你阅读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函数进行清理。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多