GNU/Linux >> Znalost Linux >  >> Linux

Kde spustitelné soubory hledají sdílené objekty za běhu?

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 .


Linux
  1. Kde by měl být umístěn místní spustitelný soubor?

  2. Jak vyhledat výstupní kódy pro aplikace?

  3. Linux – Problémy s oprávněními pro sdílený adresář na serveru?

  1. „který“ ekvivalent pro sdílené knihovny?

  2. Dynamické automatické doplňování Zsh pro vlastní příkazy?

  3. Co hledat u poskytovatele cloudového hostingu

  1. Jak vytvořit sdílený adresář pro všechny uživatele v Linuxu

  2. Dynamická sdílená knihovna C++ v systému Linux

  3. Kde hledá django instanci SQLite? (Je vyžadován SQLite 3.8.3 nebo novější (nalezeno 3.7.17))