Mac OS X - привязка исполняемого файла к другой динамической библиотеке, загрузка как старой, так и новой

У меня есть инструмент командной строки, созданный с помощью Xcode, который связан с некоторыми платформами Apple.

В качестве "личного эксперимента" (просто пытаясь немного понять, как работают динамические библиотеки) я попытался указать исполняемому файлу другую версию тех же фреймворков.

Скажем, например, что исполняемый файл EXEC использует LIB_A, а последний использует LIB_B.

Я сделал копию как LIB_A, так и LIB_B, поместив их в другой (более короткий) путь к каталогу.

я использовал otool -L чтобы получить зависимости и идентификаторы библиотек.

Я тогда использовал install_name_tool с директивой -id изменить идентификаторы новых LIB_A и LIB_B (в основном просто изменить начальный путь, поскольку имя не изменилось).

Тогда с директивой -change Я позволил новому LIB_A указывать на новый LIB_B и позволить исполняемому файлу EXEC указывать на новый LIB_A.

Таким образом, я думал, что все дерево зависимостей должно быть правильно воссоздано.


install_name_tool не возвращал ошибок и проверял исполняемый файл и новые библиотеки с otool все они указывают на правильный путь.

К сожалению, при запуске исполняемого файла EXEC в консоль выдается много ошибок, связанных с повторным определением классов. Так же, как старые библиотеки и новые были загружены обеими.

В конце концов, все зависает с Trace/BPT trap: 5

Например:

objc[25992]: Class NSAppleEventManager is implemented in both 
             /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation and
             /xyz/Foundation.
             One of the two will be used. Which one is undefined.

Если я призываю

export DYLD_PRINT_LIBRARIES=1

Я вижу при исполнении, что на самом деле библиотеки загружаются дважды.

1 ответ

Я на самом деле решил проблему путем жестокой настройки

export DYLD_LIBRARY_PATH=

Это сработало для моей конкретной ситуации.

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