Zrozumienie wspólnych bibliotek w Linux
- 3050
- 980
- Juliusz Janicki
W programowaniu biblioteka jest asortymentem wstępnie skompilowanych elementów kodu, które można ponownie wykorzystać w programie. Biblioteki upraszczają żywotność programistów, ponieważ zapewniają funkcje, procedury, klasy, struktury danych itd.
Na przykład, jeśli budujesz aplikację, która musi wykonywać operacje matematyczne, nie musisz tworzyć nowej funkcji matematycznej, możesz po prostu używać istniejących funkcji w bibliotekach do tego języka programowania.
Przykłady bibliotek w Linux obejmują Libc (standardowa biblioteka c) lub Glibc (Wersja GNU standardowej biblioteki C), libcurl (Biblioteka przesyłania plików multiprotocol), libcrypt (Biblioteka używana do szyfrowania, mieszania i kodowania w C) i wielu innych.
Linux obsługuje dwie klasy bibliotek, a mianowicie:
- Biblioteki statyczne - są statycznie związane z programem w czasie kompilacji.
- Biblioteki dynamiczne lub wspólne - są ładowane po uruchomieniu programu i ładowaniu do pamięci i wiązania występuje w czasie wykonywania.
Biblioteki dynamiczne lub wspólne można dalej podzielić na:
- Dynamicznie połączone biblioteki - Tutaj program jest powiązany z biblioteką udostępnioną, a jądro ładuje bibliotekę (na wypadek, gdyby nie jest w pamięci) po wykonaniu.
- Dynamicznie załadowane biblioteki - Program przejmuje pełną kontrolę, wywołując funkcje z biblioteką.
Wspólne konwencje nazewnictwa bibliotecznego
Udostępnione biblioteki są wymienione na dwa sposoby: nazwa biblioteki (a.k.A Soname) oraz „nazwa pliku” (bezwzględna ścieżka do pliku, który przechowuje kod biblioteki).
Na przykład Soname Do Libc Jest Libc.Więc.6: Gdzie Lib to prefiks, C jest opisową nazwą, więc oznacza współdzielony obiekt i 6 to wersja. A jego nazwa pliku to: /lib64/libc.Więc.6. Zauważ, że Soname jest w rzeczywistości symbolicznym linkiem do nazwy pliku.
Lokalizacja wspólnych bibliotek w Linux
Udostępnione biblioteki są ładowane przez Ld.Więc (Lub Ld.Więc.X) I LD-Linux.Więc (Lub LD-Linux.Więc.X) programy, gdzie X to wersja. W Linux, /lib/ld-linux.Więc.X wyszukuje i ładuje wszystkie współdzielone biblioteki używane przez program.
Program może wywołać bibliotekę za pomocą nazwy biblioteki lub nazwy pliku, a ścieżka biblioteczna przechowuje katalogi, w których biblioteki można znaleźć w systemie plików. Domyślnie biblioteki znajdują się w /USR/Local/Lib, /usr/local/lib64, /usr/lib I /usr/lib64; Biblioteki uruchamiania systemu są w /lib I /lib64. Programiści mogą jednak instalować biblioteki w niestandardowych lokalizacjach.
Ścieżkę biblioteki można zdefiniować w /etc/ld.Więc.conf plik, który możesz edytować za pomocą edytora wiersza poleceń.
# vi /etc /ld.Więc.conf
Linia (y) w tym pliku instruują jądro do załadowania pliku /etc/ld.Więc.conf.D. W ten sposób konserwatorzy pakietów lub programiści mogą dodać swoje niestandardowe katalogi biblioteczne do listy wyszukiwania.
Jeśli spojrzysz na /etc/ld.Więc.conf.D Directory, zobaczysz .conf Pliki dla niektórych typowych pakietów (w tym przypadku jądro, MySQL i PostgreSQL):
# ls /etc /ld.Więc.conf.D jądro-2.6.32-358.18.1.El6.x86_64.Confir Kernel-2.6.32-696.1.1.El6.x86_64.Conf Mariadb-X86_64.Confir Kernel-2.6.32-642.6.2.El6.x86_64.Confir Kernel-2.6.32-696.6.3.El6.x86_64.Conf Postgresql-PGDG-libs.conf
Jeśli spojrzysz na mariadb-x86_64.conf, zobaczysz bezwzględną ścieżkę do bibliotek pakietowych.
# Cat Mariadb-X86_64.conf /usr/lib64/mysql
Powyższa metoda ustawia ścieżkę biblioteki na stałe. Aby tymczasowo ustawić, użyj Ld_library_path Zmienna środowiskowa w wierszu poleceń. Jeśli chcesz utrzymać zmiany na stałe, dodaj ten wiersz w pliku inicjalizacji powłoki /itp./Profil (globalny) lub ~/.profil (specyficzny dla użytkownika).
# Eksport LD_LiBRARY_PATH =/ścieżka/do/biblioteka/plik
Zarządzanie wspólnymi bibliotekami w Linux
Spójrzmy teraz, jak radzić sobie ze wspólnymi bibliotekami. Aby uzyskać listę wszystkich udostępnionych zależności biblioteki dla pliku binarnego, możesz użyć Narzędzie LDD. Wyjście ldd jest w formie:
Nazwa biblioteki => nazwa pliku (jakaś wartość szesnastkowa) lub nazwa pliku (pewna wartość szesnastka) #jest pokazana, gdy nazwy biblioteki nie można odczytać
To polecenie pokazuje wszystkie współdzielone zależności biblioteki dla polecenia LS.
# ldd/usr/bin/ls lub # ldd/bin/ls
Przykładowy wyjście
Linux-Vdso.Więc.1 => (0x00007ffebf9c2000) libselinux.Więc.1 => /lib64 /libselinux.Więc.1 (0x0000003b71e00000) Librt.Więc.1 => /lib64 /librt.Więc.1 (0x0000003b71600000) libcap.Więc.2 => /lib64 /libcap.Więc.2 (0x0000003b76a00000) libacl.Więc.1 => /lib64 /libacl.Więc.1 (0x0000003b75e00000) libc.Więc.6 => /lib64 /libc.Więc.6 (0x0000003b70600000) Libdl.Więc.2 => /lib64 /libdl.Więc.2 (0x0000003b70a00000) /lib64 /ld-linux-x86-64.Więc.2 (0x0000561abfc09000) libpthread.Więc.0 => /lib64 /libpthread.Więc.0 (0x0000003b70e00000) libattr.Więc.1 => /lib64 /libattr.Więc.1 (0x00003B75600000)
Ponieważ wspólne biblioteki mogą istnieć w wielu różnych katalogach, przeszukiwanie wszystkich tych katalogów po uruchomieniu programu byłoby bardzo nieefektywne: co jest jedną z prawdopodobnych wad dynamicznych bibliotek. Dlatego stosuje się mechanizm buforowania, wykonany przez program LDCONFIG.
Domyślnie, LDCONFIG czyta treść /etc/ld.Więc.conf, tworzy odpowiednie symboliczne linki w dynamicznych katalogach linków, a następnie pisze pamięć podręczną /etc/ld.Więc.Pamięć podręczna który jest następnie łatwo używany przez inne programy.
Jest to bardzo ważne, zwłaszcza gdy zainstalowałeś nowe biblioteki udostępnione lub stworzyłeś własne lub stworzyłeś nowe katalogi biblioteczne. Musisz uruchomić LDCONFIG polecenie wprowadzenia zmian.
# ldconfig lub # ldconfig -v #Shows pliki i katalogi, z którymi działa
Po utworzeniu współdzielonej biblioteki musisz ją zainstalować. Możesz przenieść go do dowolnego ze standardowych wyżej wymienionych katalogów i uruchomić LDCONFIG Komenda.
Alternatywnie, uruchom następujące polecenie, aby utworzyć symboliczne linki z Soname do nazwy pliku:
# ldconfig -n/ścieżka/do/Twoje/shared/biblioteki
Aby rozpocząć od tworzenia własnych bibliotek, sprawdź ten przewodnik z projektu dokumentacji Linux (TLDP).
To wszystko na teraz! W tym artykule przedstawiliśmy Ci wprowadzenie do bibliotek i wyjaśniliśmy wspólne biblioteki oraz sposób zarządzania nimi w Linux. Jeśli masz jakieś zapytania lub dodatkowe pomysły do udostępnienia, skorzystaj z poniższego formularza komentarza.