Разделяемая библиотека HOWTO объясняет большинство механизмов , вовлеченных, и динамический загрузчик руководство переходит в более подробно. Каждый вариант Unix имеет свой собственный путь, но большинство использует один и тот же исполняемый формат ( ELF ) и имеют похожие динамические компоновщики (производные от Solaris). Ниже я обобщу общее поведение с акцентом на Linux; проверьте руководства вашей системы для полной истории.
Короче говоря, когда он ищет динамическую библиотеку ( .so
файл), компоновщик пытается:
- каталоги, перечисленные в
LD_LIBRARY_PATH
переменной среды ( DYLD_LIBRARY_PATH
в OSX);
- каталоги, перечисленные в rpath исполняемого файла ;
- каталоги в системном поисковом пути, который (по крайней мере в Linux) состоит из записей в
/etc/ld.so.conf
плюс /lib
и /usr/lib
.
Rpath хранится в исполняемом файле (это динамический атрибут DT_RPATH
или DT_RUNPATH
). Он может содержать абсолютные пути или пути, начинающиеся с того, $ORIGIN
чтобы указывать путь относительно местоположения исполняемого файла (например, если исполняемый файл находится в, /opt/myapp/bin
а его rpath равен, $ORIGIN/../lib:$ORIGIN/../plugins
то динамический компоновщик будет искать /opt/myapp/lib
и /opt/myapp/plugins
). Rpath обычно определяется, когда исполняемый файл компилируется, с -rpath
опцией ld
, но впоследствии вы можете изменить ее с помощью chrpath
.
В сценарии вы описали, если вы разработчик или упаковщик приложения и предназначаются для того , чтобы установить в …/bin
, …/lib
структуре, а затем связать с -rpath='$ORIGIN/../lib'
. Если вы устанавливаете предварительно собранный двоичный файл в своей системе, либо поместите библиотеку в каталог на пути поиска ( /usr/local/lib
если вы системный администратор, в противном случае - каталог, который вы добавляете $LD_LIBRARY_PATH
), либо попробуйте chrpath
.
/lib64
и/usr/lib64
используются для 64-разрядных двоичных файлов и/lib
и/usr/lib
используются для 32-разрядных двоичных файлов.