从dylib中获取mach-o插件包的路径

时间:2013-12-08 16:45:56

标签: bundle dylib mach-o

我正在尝试获取运行dylib模块时由另一个进程加载的插件包的可执行路径。

运行非插件捆绑包时,例如一个常规的应用程序,它很容易打电话 [[NSBundle mainBundle] executablePath]。但是,使用插件包时,将返回托管应用程序的路径,而不是插件包的路径。

在这种情况下,可以使用以下棘手的代码来获取可执行文件的路径:

#include <dlfcn.h>

const char* getExecutableFile()
{
    Dl_info exeInfo;
    dladdr((void*) getExecutableFile, &exeInfo);
    return exeInfo.dli_fname;
}

这将返回正确的bundle可执行文件的路径,除非在dylib导出的函数中调用此函数,该函数返回dylib的路径。

有没有办法在对不同模块中的函数的调用中始终如一地获取bundle可执行文件的路径?

1 个答案:

答案 0 :(得分:2)

如果直接使用dyld API,则可以这样做。事实上,这很容易。以下代码转储所有图像及其偏移量(和ASLR值)。

#include <mach-o/dyld.h>

// List all mach-o images in a process
uint32_t i;
uint32_t ic = _dyld_image_count();
printf ("Got %d images\n",ic); for (i = 0; i < ic; i++)
{
    printf ("%d: %p\t%s\t(slide: %p)\n", i, 
            _dyld_get_image_header(i),
           _dyld_get_image_name(i), 
            _dyld_get_image_slide(i));

}

很自然地,您可以在dyld_get_image_name()返回的char *中strstr()您的包名称,并且您将获得它的完整路径。

参考:&#34; Mac OS X和iOS Internals&#34; (Wiley,2012),第123页。