我正在尝试获取运行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可执行文件的路径?
答案 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页。