Получение пути комплекта плагинов 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.

Другие вопросы по тегам