Разделяемая библиотека 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-разрядных двоичных файлов.