Загрузить именованные неэкспортированные символы с помощью dlsym?

Можно ли загрузить именованный неэкспортированный символ из каркаса, используя dlsym?

Символ, который я пытаюсь импортировать, имеет имя, под которым он упоминается в рамках. Это функция, которую мне нужно вызвать.

Я пытаюсь сделать это как обычно dlopen + dlsym Кстати, но когда я пытаюсь загрузить символ, который не экспортируется, dlsym возвращает нулевой указатель.

1 ответ

Решение

dlsym можно загружать только те функции, которые перечислены в таблице символов. Вы можете перечислить таблицу символов, запустив nm на рассматриваемой основе.

Вы можете проверить это в источнике dyld: ImageLoaderMachOClassic::findExportedSymbol это внутренняя реализация dlsym, она просто выполняет двоичный поиск в таблице символов:

А также ImageLoaderMachO::parseLoadCmds загружает таблицу символов из команд загрузки в заголовке Mach:

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