【问题标题】:Loading and executing bundle from memory从内存加载和执行包
【发布时间】:2012-08-03 12:40:39
【问题描述】:

通过 NSCreateObjectFileImageFromMemory 函数可以从内存中加载包。有没有人在这方面有成功的经验?有没有人有这个功能的工作样本? 我的代码如下:

text srcPath = "/Applications/TextEdit.app/Contents/MacOS/TextEdit";
data_t data;
data.loadFromFile(srcPath);
void *addr;
kern_return_t err;
NSObjectFileImage img = nil;
NSObjectFileImageReturnCode dyld_err;

err = vm_allocate(mach_task_self(), (vm_address_t *)&addr,
    data.length(), true);
if(err == 0)
{
    //err = vm_write(mach_task_self(), (vm_address_t)addr,
        //(vm_address_t)(char*)data, data.length());
    memcpy(addr, (char*)data, data.length());
    if(err == 0)
        dyld_err =
            NSCreateObjectFileImageFromMemory(addr, data.length(), &img);
        // error is NSObjectFileImageFailure
}

img 变量为空(错误为 NSObjectFileImageFailure)。为什么?

谢谢。

【问题讨论】:

    标签: macos cocoa bundle macos-carbon core-foundation


    【解决方案1】:

    从manpage看来,似乎只有MH_BUNDLE文件可以加载NSCreateObjectFileImageFromMemory()和朋友。

    MH_BUNDLE文件解释here。

    MH_BUNDLE 文件类型是您的代码通常使用的类型 在运行时加载(通常称为捆绑包或插件)。按照惯例, 此格式的文件扩展名为 .bundle。

    请注意,该手册页适用于 10.4,并且似乎没有更新的版本可用。

    【讨论】:

    • 谢谢,我也被 XC​​ode 创建了一个简单的包(扩展名为 .bundle),但没有成功。
    • 好的,我发现了问题,1. 可以加载 MH_BUNDLE 文件 2. loader 和 bundle 应该具有相同的架构(32 位或 64 位)。
    猜你喜欢
    • 2021-04-28
    • 2016-04-02
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多