Rozumím tomu, jak definovat zahrnutí sdílených objektů v době propojení/kompilace. Stále mě však zajímá, jak spustitelné soubory hledají sdílený objekt (*.so
knihovny) v době provádění.
Například moje aplikace a.out
volá funkce definované v lib.so
knihovna. Po kompilaci přesunu lib.so
do nového adresáře v mém $HOME
.
Jak zjistím a.out
jít to tam hledat?
Přijatá odpověď:
Sdílená knihovna HOWTO vysvětluje většinu zahrnutých mechanismů a manuál dynamického zavaděče jde do podrobností. Každá unixová varianta má svůj vlastní způsob, ale většina používá stejný spustitelný formát (ELF) a má podobné dynamické linkery¹ (odvozené ze Solaris). Níže shrnuji běžné chování se zaměřením na Linux; celý příběh naleznete v příručkách vašeho systému.
(Poznámka k terminologii:část systému, která načítá sdílené knihovny, se často nazývá „dynamický linker“, ale někdy pro upřesnění „dynamický zavaděč“. „Dynamický linker“ může také znamenat nástroj, který generuje pokyny pro dynamický zavaděč při kompilaci program nebo kombinace nástroje v době kompilace a zavaděče za běhu. V této odpovědi se „linker“ týká části za běhu.)
Stručně řečeno, když hledá dynamickou knihovnu (.so
soubor) se linker pokusí:
- adresáře uvedené v
LD_LIBRARY_PATH
proměnná prostředí (DYLD_LIBRARY_PATH
na OSX); - adresáře uvedené v cestě rpath spustitelného souboru;
- adresáře na systémové vyhledávací cestě, která (alespoň na Linuxu) sestává z položek v
/etc/ld.so.conf
plus/lib
a/usr/lib
.
Cesta rpath je uložena ve spustitelném souboru (je to DT_RPATH
nebo DT_RUNPATH
dynamický atribut). Může obsahovat absolutní cesty nebo cesty začínající $ORIGIN
k označení cesty vzhledem k umístění spustitelného souboru (např. pokud je spustitelný soubor v /opt/myapp/bin
a jeho rpath je $ORIGIN/../lib:$ORIGIN/../plugins
pak se dynamický linker podívá do /opt/myapp/lib
a /opt/myapp/plugins
). Rpath se normálně určuje při kompilaci spustitelného souboru pomocí -rpath
možnost ld
, ale můžete to později změnit pomocí chrpath
.
Ve scénáři, který popisujete, pokud jste vývojář nebo balíčkovač aplikace a máte v úmyslu ji nainstalovat do …/bin
, …/lib
struktura, pak odkaz s -rpath='$ORIGIN/../lib'
. Pokud do systému instalujete předpřipravenou binárku, umístěte knihovnu do adresáře na vyhledávací cestě (/usr/local/lib
pokud jste správce systému, jinak adresář, který přidáte do $LD_LIBRARY_PATH
), nebo zkuste chrpath
.