Учитывая mach_header, как мне найти имя двоичного изображения? - PullRequest
0 голосов
/ 29 апреля 2020

Я исследую линкер Маха c dyld. Этот вопрос относится ко всем платформам Apple, но рад получить ответ, который будет зависеть от конкретной платформы; Я использую Obj C, но также с удовольствием переведу Swift, если это работает для вас. Соответствующие документы Apple можно найти здесь .

Я пытаюсь решить проблему взаимоблокировки в библиотеке, которую я поддерживаю, и поэтому мне нужно собрать информацию о загруженных двоичных изображениях. (для непосвященных это не изображения в формате JPEG).

Я зарегистрировал обратный вызов для отслеживания добавления двоичного изображения через _dyld_register_func_for_add_image(), и он вызывается при загрузке изображений. Я вижу, как передается структура mach_header, а также значение vmaddr_slide.

По разным причинам, позволяющим избежать взаимоблокировок, я не хочу перебирать изображения, используя _dyld_image_count() / _dyld_get_image_header() post-ho c, но вместо этого хочу отслеживать изображения по мере их загрузки / выгружается исключительно с помощью обратных вызовов add() / remove(). Обычно я мог бы вызвать _dyld_get_image_name(index), чтобы получить имя изображения, когда я повторял изображения, но, как я уже сказал, я не могу использовать итерационную модель.

Мой вопрос: на основе значений переданный в func_for_add_image() обратный вызов (с использованием любых дополнительных системных вызовов, необходимых), как я могу определить имя изображения?

1 Ответ

1 голос
/ 29 апреля 2020

Ответ , но, возможно, не Ответ следующий:

// Required header:
#include <dlfcn.h>

// This is the callback, added via _dyld_register_func_for_add_image()
void add_binary_image(const struct mach_header *header, intptr_t slide)
{
    // ...

    Dl_info  DlInfo;
    dladdr(header, &DlInfo);
    const char* image_name = DlInfo.dli_fname;

    // ...
}

Документы утверждают, что dladdr() Функция доступна только в динамически связанных программах. Инфраструктура, в которой я буду использовать это sh, также существует в виде библиотеки c. Я дошел до предела своих знаний, поэтому хочу перепроверить, правильно ли я неправильно понимаю динамические ссылки c и что использование dladdr() будет хорошо во всех современных Ma c, iOS et c , apps.

[Изменить: dladdr() вызов выше, был исправлен со ссылкой на этот ответ ]

...