Можно ли использовать 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 за исключением того, что оно не всегда переопределяет, а только переопределяет, если поставляемая библиотека новее.

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