Получение пути комплекта плагинов mach-o из dylib
Я пытаюсь получить путь к исполняемому файлу подключаемого модуля, который загружается другим процессом при запуске модуля dylib.
При запуске не подключаемого модуля, например, обычного приложения, достаточно просто вызвать[[NSBundle mainBundle] executablePath]
, Однако для пакета подключаемых модулей это возвращает путь к приложению хостинга, а не к пакету подключаемых модулей.
В этом случае следующий хитрый код может быть использован для получения пути исполняемого файла:
#include <dlfcn.h>
const char* getExecutableFile()
{
Dl_info exeInfo;
dladdr((void*) getExecutableFile, &exeInfo);
return exeInfo.dli_fname;
}
Это возвращает правильный путь к исполняемому файлу пакета, за исключением случаев, когда вызывается эта функция из функции, экспортируемой dylib, которая возвращает путь к dylib.
Есть ли способ последовательно получить путь к исполняемому файлу пакета даже из вызова функции в другом модуле?
1 ответ
Вы можете сделать это, если вы используете API-интерфейсы dyld напрямую. На самом деле это довольно просто. Следующий код сбрасывает все изображения с их смещениями (и значением 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));
}
Естественно, вы можете strstr () имя вашего пакета в char *, возвращаемом dyld_get_image_name(), и вы получите полный путь к нему.
Ссылка: "Mac OS X и iOS Internals" (Wiley, 2012), стр. 123.