Wspólna biblioteka HOWTO wyjaśnia większość mechanizmów zaangażowanych i dynamicznych instrukcja ładowarka przechodzi w bardziej szczegółowo. Każdy wariant uniksowy ma swój własny sposób, ale większość używa tego samego formatu wykonywalnego ( ELF ) i ma podobne dynamiczne linkery (pochodzące z Solaris). Poniżej podsumuję typowe zachowanie z naciskiem na Linuksa; zajrzyj do instrukcji obsługi swojego systemu, aby uzyskać pełną historię.
W skrócie, gdy szuka dynamicznej biblioteki ( .so
pliku), linker próbuje:
- katalogi wymienione w
LD_LIBRARY_PATH
zmiennej środowiskowej ( DYLD_LIBRARY_PATH
w OSX);
- katalogi wymienione w ścieżce pliku wykonywalnego ;
- katalogi na ścieżce wyszukiwania systemu, która (przynajmniej w Linuksie) składa się z pozycji w
/etc/ld.so.conf
plus /lib
i /usr/lib
.
RPATH jest przechowywany w pliku wykonywalnego (to jest DT_RPATH
albo DT_RUNPATH
atrybut dynamiczny). Może zawierać ścieżki bezwzględne lub ścieżki zaczynające się od, $ORIGIN
aby wskazać ścieżkę względem położenia pliku wykonywalnego (np. Jeśli plik wykonywalny jest w, /opt/myapp/bin
a jego ścieżka r to, $ORIGIN/../lib:$ORIGIN/../plugins
to dynamiczny linker będzie szukał /opt/myapp/lib
i /opt/myapp/plugins
). Ścieżka rp jest zwykle określana podczas kompilacji pliku wykonywalnego, z -rpath
opcją ld
, ale można ją później zmienić za pomocą chrpath
.
W scenariuszu można opisać, jeśli jesteś programistą lub pakującego wniosku i zamierza na to, aby być zainstalowane w …/bin
, …/lib
struktury, a następnie połączyć z -rpath='$ORIGIN/../lib'
. Jeśli instalujesz wstępnie skompilowany plik binarny w systemie, umieść bibliotekę w katalogu na ścieżce wyszukiwania ( /usr/local/lib
jeśli jesteś administratorem systemu, w przeciwnym razie katalog, do którego dodajesz $LD_LIBRARY_PATH
) lub spróbuj chrpath
.
/lib64
i/usr/lib64
są wykorzystywane dla 64-bitowych plików binarnych i/lib
i/usr/lib
stosowane są do 32-bitowych plików binarnych.ldconfig
.ldconfig
angażuje się podczas instalowania biblioteki.*.so
bibliotek jest nie taka sama jak$PATH
. Ścieżka wyszukiwania jest podana przez @enzotib w ich odpowiedzi. Aby wydrukować ścieżki, które będą wyszukiwane, uruchomldconfig -v 2>/dev/null | grep -v ^$'\t'
./sbin/ldconfig
i tej innej magii Andrew Bate'a, aby uruchomić go bez rootowaniaW Linuksie zachowanie jest wyjaśnione na
ld(1)
stronie manźródło
Jestem prawie pewien, że odpowiedź brzmi tutaj
ldconfig
.http://linux.die.net/man/8/ldconfig
źródło
Do uruchamiania aplikacji plik
/proc/1234/maps
zawiera wszystkie rzeczywiste dynamicznie połączone biblioteki.Gdzie
1234
jest pid działającego pliku wykonywalnego.Linux podąża za LD_LIBRARY_PATH i innymi zmiennymi, jak wskazał w odpowiedzi Gilles.
źródło