Можно ли использовать DYLD_LIBRARY_PATH в Mac OS X? И что за алгоритм динамического поиска в библиотеке?
Я прочитал некоторые статьи, не одобряющие использование DYLD_LIBRARY_PATH, так как путь к динамической библиотеке должен быть исправлен с помощью -install_name, @rpath и @loader_path.
С точки зрения создания программы, работающей как в Linux, так и в Mac OS X, DYLD_LIBRARY_PATH в Mac OS X делает именно то, что LD_LIBRARY_PATH в Linux. И мы можем поделиться (почти) тем же файлом make, который не имеет -install_name и @rpath.
- Можно ли использовать DYLD_LIBRARY_PATH в Mac OS X?
- Каков алгоритм поиска динамической библиотеки в Mac OS X, когда двоичный файл не может найти динамическую библиотеку? текущий каталог -> каталоги DYLD_LIBRARY_PATH...?
3 ответа
Как вы заметили, DYLD_LIBRARY_PATH
ведет себя как LD_LIBRARY_PATH
на другом *nix. Однако есть еще одна переменная окружения, которую вы должны посмотреть DYLD_FALLBACK_LIBRARY_PATH
,
В общем, они (как в OSX, так и в Linux) предлагаются только для разработки, так как они могут вызвать ошибки поиска символов, когда вы переопределяете библиотеку, у которой нет той же таблицы символов. Хороший пример этого - когда вы пытаетесь переопределить установку VecLib по умолчанию (например, blas lapack) с пользовательской установкой. Это приведет к тому, что символ не найдет ошибки в приложениях, связанных с системой VecLib, если DYLD_LIBRARY_PATH
устанавливается и наоборот (ошибки поиска символов в пользовательских приложениях), если это не так. Это связано с тем, что система blas/lapack не является полной реализацией библиотек ATLAS.
DYLD_FALLBACK_LIBRARY_PATH
не будет производить эти проблемы.
При установке библиотек в нестандартном месте, DYLD_FALLBACK_LIBRARY_PATH
гораздо более вменяемый Это будет искать символы в библиотеках, предоставленных в путях по умолчанию, и если символ там не найден, вернитесь к указанному пути.
Преимущество состоит в том, что этот процесс не вызовет ошибок поиска символов в приложениях, скомпилированных с библиотеками по умолчанию.
В общем, когда библиотеки установлены в нестандартных местах, следует указывать абсолютные пути, что сводит на нет неоднозначность динамического поиска.
DYLD_LIBRARY_PATH
не ведет себя как LD_LIBRARY_PATH
, OS X dlopen
Документация ( https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html) указывает, что при предоставлении абсолютного пути он сначала будет искать в местах, указанных DYLD_LIBRARY_PATH
:
Когда путь содержит косую черту, но не является каркасным путем (т. Е. Полный путь или частичный путь к dylib), dlopen() выполняет поиск следующего, пока не найдет совместимый файл Mach-O: $DYLD_LIBRARY_PATH (с именем листа из пути), затем предоставленный путь (используя текущий рабочий каталог для относительных путей), затем $DYLD_FALLBACK_LIBRARY_PATH (с именем листа из пути).
Другими словами, если вы установите DYLD_LIBRARY_PATH
в /Hello
следующие два dlopen
звонки:
dlopen("/Hello/libfoo.so", RTLD_NOW);
dlopen("/World/libfoo.so", RTLD_NOW);
оба решат /Hello/libfoo.so
, Это довольно нелогично и представляет собой уязвимость безопасности. Использование программного обеспечения dlopen
не может гарантировать, что загружает правильные библиотеки (возможно, переопределить DYLD_LIBRARY_PATH
в собственном окружении?)
Для документации по переменным среды редактора динамических ссылок и как они влияют на поиск динамических библиотек, man dyld
,
DYLD_LIBRARY_PATH
Это разделенный двоеточиями список каталогов, содержащих библиотеки. Динамический компоновщик просматривает эти каталоги, прежде чем он ищет в расположениях по умолчанию для библиотек. Это позволяет вам тестировать новые версии существующих библиотек.
Для каждой библиотеки, которую использует программа, динамический компоновщик ищет ее в каждом каталоге в DYLD_LIBRARY_PATH по очереди. Если он по-прежнему не может найти библиотеку, он выполняет поиск по очереди в DYLD_FALLBACK_FRAMEWORK_PATH и DYLD_FALLBACK_LIBRARY_PATH.
Используйте опцию -L для otool(1). чтобы обнаружить рамки и разделяемые библиотеки, с которыми связан исполняемый файл.
DYLD_FALLBACK_LIBRARY_PATH
Это разделенный двоеточиями список каталогов, содержащих библиотеки. Он используется в качестве расположения по умолчанию для библиотек, не найденных в пути их установки. По умолчанию он установлен в $ (HOME) / lib: / usr / local / lib: / lib: / usr / lib.
DYLD_VERSIONED_LIBRARY_PATH
Это разделенный двоеточиями список каталогов, которые содержат потенциальные библиотеки переопределения. Динамический компоновщик ищет в этих каталогах динамические библиотеки. Для каждой найденной библиотеки dyld просматривает свой LC_ID_DYLIB и получает current_version и имя установки. Затем Дилд ищет библиотеку по пути установки имени. В зависимости от того, какое значение имеет большее значение current_version, оно будет использоваться в процессе всякий раз, когда требуется библиотека с таким именем установки. Это похоже на DYLD_LIBRARY_PATH за исключением того, что оно не всегда переопределяет, а только переопределяет, если поставляемая библиотека новее.