it-swarm-eu.dev

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

Rozumím, jak definovat zahrnutí sdílených objektů v době propojení/kompilace. Pořád se ale ptám, jak spustitelné soubory hledají sdílený objekt (*.so knihovny) v době provedení.

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 mohu říct a.out hledat to tam?

120
rahmu

sdílená knihovna HOWTO vysvětluje většinu zapojených mechanismů a příručka 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 (odvozeno z Solaris). Níže shrnu běžné chování se zaměřením na Linux; podívejte se do příruček vašeho systému, kde najdete celý příběh.

Stručně řečeno, když hledá dynamickou knihovnu (.so file) se linker pokusí:

  • adresáře uvedené v LD_LIBRARY_PATH proměnná prostředí (DYLD_LIBRARY_PATH v OSX);
  • adresáře uvedené v rpath ;
  • adresáře na systémové vyhledávací cestě, která (alespoň v Linuxu) sestává ze záznamů v /etc/ld.so.conf Plus /lib a /usr/lib.

Cesta 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 dráha je $Origin/../lib:$Origin/../plugins pak bude dynamický linker vypadat v /opt/myapp/lib a /opt/myapp/plugins). Rpath se obvykle určuje při kompilaci spustitelného souboru pomocí -rpath možnost ld, ale můžete ji později změnit pomocí chrpath .

Ve scénáři, který popíšete, pokud jste vývojář nebo balič aplikace a hodláte ji nainstalovat do …/bin, …/lib struktura, poté propojení s -rpath='$Origin/../lib'. Pokud do svého systému instalujete předem vytvořený binární soubor, 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.

V Linuxu je chování vysvětleno na manuálové stránce ld(1)

       The linker uses the following search paths to locate required
       shared libraries:

       1.  Any directories specified by -rpath-link options.

       2.  Any directories specified by -rpath options.  The difference
           between -rpath and -rpath-link is that directories specified by
           -rpath options are included in the executable and used at
           runtime, whereas the -rpath-link option is only effective at
           link time. Searching -rpath in this way is only supported by
           native linkers and cross linkers which have been configured
           with the --with-sysroot option.

       3.  On an ELF system, for native linkers, if the -rpath and
           -rpath-link options were not used, search the contents of the
           environment variable "LD_RUN_PATH".

       4.  On SunOS, if the -rpath option was not used, search any
           directories specified using -L options.

       5.  For a native linker, the search the contents of the environment
           variable "LD_LIBRARY_PATH".

       6.  For a native ELF linker, the directories in "DT_RUNPATH" or
           "DT_RPATH" of a shared library are searched for shared
           libraries needed by it. The "DT_RPATH" entries are ignored if
           "DT_RUNPATH" entries exist.

       7.  The default directories, normally /lib and /usr/lib.

       8.  For a native linker on an ELF system, if the file
           /etc/ld.so.conf exists, the list of directories found in that
           file.

       If the required shared library is not found, the linker will issue
       a warning and continue with the link.
16
enzotib

Jsem si jistý, že odpověď je ldconfig.

ldconfig vytvoří potřebné odkazy a mezipaměť k nejnovějším sdíleným knihovnám nalezeným v adresářích zadaných na příkazovém řádku, v souboru /etc/ld.so.conf a v důvěryhodných adresářích (/ lib a/usr/lib). Mezipaměť je používána linkovacím modulem run-time ld.so nebo ld-linux.so. ldconfig zkontroluje záhlaví a názvy souborů knihoven, se kterými se setká při určování, které verze by měly mít své odkazy aktualizovány.

http://linux.die.net/man/8/ldconfig

3
Sean C.

Pro spouštění aplikací soubor /proc/1234/maps obsahuje všechny skutečné dynamicky propojené knihovny.

Kde 1234 je pid spuštěného spustitelného souboru.

Linux sleduje LD_LIBRARY_PATH a další proměnné, jak zdůraznil Gilles v odpovědi.

0
user138692