Wyszukiwanie w witrynie

Zrozumienie bibliotek współdzielonych w systemie Linux


W programowaniu biblioteka to zbiór wstępnie skompilowanych fragmentów kodu, które można ponownie wykorzystać w programie. Biblioteki ułatwiają życie programistom, ponieważ zapewniają funkcje, procedury, klasy, struktury danych i tak dalej (napisane przez innego programistę) wielokrotnego użytku, które mogą wykorzystać w swoich programach.

Na przykład, jeśli budujesz aplikację, która musi wykonywać operacje matematyczne, nie musisz tworzyć do tego nowej funkcji matematycznej, możesz po prostu użyć istniejących funkcji w bibliotekach dla tego języka programowania.

Przykłady bibliotek w Linuksie to libc (standardowa biblioteka C) lub Glibc (wersja GNU standardowej biblioteki C), libcurl (plik wieloprotokołowy transfer Library), libcrypt (biblioteka używana do szyfrowania, mieszania i kodowania w C) i wiele innych.

Linux obsługuje dwie klasy bibliotek, a mianowicie:

  • Biblioteki statyczne – są powiązane z programem statycznie w czasie kompilacji.
  • Biblioteki dynamiczne lub współdzielone – są ładowane podczas uruchamiania programu i ładowane do pamięci, a wiązanie następuje w czasie wykonywania.

Biblioteki dynamiczne lub współdzielone można dalej podzielić na:

  • Biblioteki powiązane dynamicznie – tutaj program jest łączony z biblioteką współdzieloną, a jądro ładuje bibliotekę (jeśli nie ma jej w pamięci) po uruchomieniu.
  • Biblioteki ładowane dynamicznie – program przejmuje pełną kontrolę poprzez wywoływanie funkcji z biblioteką.

Konwencje nazewnictwa bibliotek współdzielonych

Biblioteki współdzielone nazywane są na dwa sposoby: nazwa biblioteki (inaczej soname) i „nazwa pliku” (bezwzględna ścieżka do pliku przechowującego kod biblioteki).

Na przykład sonam dla libc to libc.so.6: gdzie lib to przedrostek, c to nazwa opisowa, czyli oznacza obiekt współdzielony, a 6 to wersja. A jego nazwa pliku to: /lib64/libc.so.6. Zauważ, że soname jest w rzeczywistości dowiązaniem symbolicznym do nazwy pliku.

Lokalizowanie bibliotek współdzielonych w systemie Linux

Biblioteki współdzielone są ładowane przez ld.so (lub ld.so.x) i ld-linux.so (lub ld- linux.so.x), gdzie x to wersja. W systemie Linux /lib/ld-linux.so.x wyszukuje i ładuje wszystkie biblioteki współdzielone używane przez program.

Program może wywołać bibliotekę, używając jej nazwy biblioteki lub nazwy pliku, a ścieżka biblioteki przechowuje katalogi, w których można znaleźć biblioteki w systemie plików. Domyślnie biblioteki znajdują się w /usr/local/lib, /usr/local/lib64, /usr/lib i /usr/lib64; biblioteki startowe systemu znajdują się w /lib i /lib64. Programiści mogą jednak instalować biblioteki w niestandardowych lokalizacjach.

Ścieżkę biblioteki można zdefiniować w pliku /etc/ld.so.conf, który można edytować za pomocą edytora wiersza poleceń.

vi /etc/ld.so.conf 

Linie w tym pliku instruują jądro, aby załadować plik w /etc/ld.so.conf.d. W ten sposób opiekunowie pakietów lub programiści mogą dodać swoje niestandardowe katalogi bibliotek do listy wyszukiwania.

Jeśli zajrzysz do katalogu /etc/ld.so.conf.d, zobaczysz pliki .conf dla niektórych popularnych pakietów (jądro, mysql i postgresql w ta sprawa):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Jeśli spojrzysz na plik mariadb-x86_64.conf, zobaczysz bezwzględną ścieżkę do bibliotek pakietów.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Powyższa metoda ustawia na stałe ścieżkę biblioteki. Aby ustawić to tymczasowo, użyj zmiennej środowiskowej LD_LIBRARY_PATH w wierszu poleceń. Jeśli chcesz zachować zmiany na stałe, dodaj tę linię do pliku inicjującego powłokę /etc/profile (globalny) lub ~/.profile (specyficzny dla użytkownika).

export LD_LIBRARY_PATH=/path/to/library/file

Zarządzanie bibliotekami współdzielonymi w systemie Linux

Przyjrzyjmy się teraz, jak postępować z bibliotekami współdzielonymi. Aby uzyskać listę wszystkich zależności bibliotek współdzielonych dla pliku binarnego, możesz użyć narzędzia ldd. Dane wyjściowe ldd mają postać:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

To polecenie wyświetla wszystkie zależności bibliotek współdzielonych dla polecenia ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Przykładowe wyjście
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Ponieważ biblioteki współdzielone mogą znajdować się w wielu różnych katalogach, przeszukiwanie wszystkich tych katalogów po uruchomieniu programu byłoby znacznie nieefektywne: co jest jedną z prawdopodobnych wad bibliotek dynamicznych. Dlatego zastosowano mechanizm buforowania, realizowany przez program ldconfig.

Domyślnie ldconfig odczytuje zawartość /etc/ld.so.conf, tworzy odpowiednie dowiązania symboliczne w katalogach łączy dynamicznych, a następnie zapisuje pamięć podręczną do /etc/ld.so.cache, który jest następnie łatwo używany przez inne programy.

Jest to bardzo ważne zwłaszcza wtedy, gdy właśnie zainstalowałeś nowe biblioteki współdzielone, utworzyłeś własne lub utworzyłeś nowe katalogi bibliotek. Aby zastosować zmiany, musisz uruchomić polecenie ldconfig.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Po utworzeniu biblioteki współdzielonej musisz ją zainstalować. Możesz przenieść go do dowolnego ze standardowych katalogów wymienionych powyżej i uruchomić polecenie ldconfig.

Alternatywnie uruchom następującą komendę, aby utworzyć dowiązania symboliczne z soname do nazwy pliku:

ldconfig -n /path/to/your/shared/libraries

Aby rozpocząć tworzenie własnych bibliotek, zapoznaj się z tym przewodnikiem z The Linux Documentation Project (TLDP).

To wszystko na teraz! W tym artykule przedstawiliśmy wprowadzenie do bibliotek i wyjaśniliśmy biblioteki współdzielone oraz sposoby zarządzania nimi w systemie Linux. Jeśli masz jakieś pytania lub dodatkowe pomysły, którymi możesz się podzielić, skorzystaj z poniższego formularza komentarza.