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=
Это сработало для моей конкретной ситуации.