From: xf0r3m Date: Tue, 23 Apr 2024 15:14:06 +0000 (+0200) Subject: Kontynuacja tworzenia 14 rozdziału. Podrozdział 14.1.3 - Konsolidacja programów z... X-Git-Url: https://gitweb.morketsmerke.org/?a=commitdiff_plain;h=a2c26cf7fe251b5e5a25d66975d0dd5ee89f2906;p=mmdev.git Kontynuacja tworzenia 14 rozdziału. Podrozdział 14.1.3 - Konsolidacja programów z bibliotekami współużytkownymi. --- diff --git a/articles/terminallog/Linux.Podstawy.html b/articles/terminallog/Linux.Podstawy.html index 436ff24..cc298e5 100644 --- a/articles/terminallog/Linux.Podstawy.html +++ b/articles/terminallog/Linux.Podstawy.html @@ -11518,6 +11518,186 @@ $ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud wykluczymy.

14.1.3. Biblioteki współużytkowane

+

+ Jak wiemy konsolidator zawsze dodaje do programów standardową + bibliotekę języka C - libc.a. Ten plik jest + biblioteką statyczną. Oznacza to, że konsolidator + podczas tworzenia właściwego pliku wykonywalne będzie kopiować do + naszego pliku fragmenty kodu maszynowego z biblioteki, wówczas plik + biblioteki nie będzie nam potrzeby do uruchomienia. +

+

+ Tego typu ma dwie dość znaczące wady. Pierwszą z nich są rozmiary + bibliotek statycznych, a co za tym idzie rozmiary naszych programów + oraz zajętosć pamięci operacyjnej podczas ich pracy. Drugą wadą, ale + i nie kiedy zaletą, jest fakt przechowywanie kopii kodu biblioteki + (oczywiście, określonych fragmentów), wewnątrz gotowego pliku + wykonywalnego. Może być to wadą w momencie gdy, niektóre używane + przez nas funkcje mogą okazać się niebezpieczenie i potrzebne będzie + rekompilacja, a zaletą gdy twórcy przy okazji kolejnej wersji + biblioteki zmieną coś, co nie dokońca będzie nam pasować lub zmiany + będą zawierać błędy. Wówczas funkcje używane w naszym programie dalej + pozostaną takie jakie powinny być według naszego projektu. +

+

+ Rozwiązaniem wyżej wymienionych są obecnie stoswane + biblioteki współdzielone. Podczas konsolidacji z + wykorzystaniem bibliotek współdzielonych, nie są kopiowane całe + fragmenty kodu, a tylko odwołania do nazw w bibliotece. W tym + przypadku biblioteka jest ładowana do pamięci w momencie gdy są + potrzebne. Dodatkową zaletą tego rozwiązania jest fakt, że procesy + mogą współdzielić ze sobą obszar pamięci, w którym znajdują się + biblioteki, aby nie ładować ich za każdym razem, gdy uruchamiamy + jakiś program. +

+

+ Czasami po aktualizacji pakietów naszej dystrybucji, nie które + otwarte programy mogą zachowywać się dziwnie lub przestać odpowiadać, + może dziać się to, ze względu na to iż manadżer pakietów + zaktualizował wraz z oprogramowaniem pakiety bibliotek + współdzielonych. Wówczas wystarczy ponowne uruchomienie systemu + (niektóre menedżery pakietów mogą same to zasugerować) i + wszystko powinno wrócić do normy. Ta sama reguła tyczy się również + jądra. Tutaj warto wspomnieć o różnicy między Uniksami a innymi + systemami. W przypadku Uniksów, aktualizacja jest świadomym + działaniem administracyjnym, wymagającym rozwagi oraz przemyślenia + idących za nimi konsekwencji. +

+

+ Rozwiązanie bibliotek współdzielonych nie jest rozwiązaniem bez wad. + Biblioteki współużytkowane mają nieco bardziej złożony proces obsługi, + a i sam proces kompilacji staje się nieco bardziej skomplikowanym + zadaniem. Chcąc wykorzystywać biblioteki w swoich programach musimy + odpowiedzieć sobie na kilka pytań: +

+ +

Wypisywanie zależności od bibliotek współużytkowanych

+

+ Omawiajac kwestię bibliotek wspominalśmy miejsce ich położenia w + systemie. We współczesnych dystrybucjach katalog /lib jest + dowiązaniem symbolicznym do /usr/lib. Nie uświadczymy + również zbyt wielu bibliotek statycznych. Większość znich to + do biblioteki współdzielone, których pliki mają rozszerzenie + .so. Tego typu plików nawet w małym systemie, może być + klikadziesiąt. Aby ustalić z jakich bibliotek korzysta konkretny + program możemy użyć polecnia ldd. +

+
+xf0r3m@vm-2339495:~/C$ ls
+a.out  aux.c  aux.o  hello  hello.c  main.c  main.o  myprog
+xf0r3m@vm-2339495:~/C$ ldd myprog
+        linux-vdso.so.1 (0x00007fffc13dd000)
+        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a32d99000)
+        /lib64/ld-linux-x86-64.so.2 (0x00007f1a32f94000)
+
+

+ Polecenie ldd wymaga argumentu w + postaci wskazania pliku wykonywalnego. Ten program zwróci nam + wszystkie zależność od bibliotek podanego programu. Jak możemy + zauważyć na powyższym przykładzie mimo tak prostego programu, + linker dołacza standardową bibliotekę języka C, konsolidator + dynamiczny + (ld-linux-x86-64.so.2, + opisany poniżej) oraz + bibliotekę ułatwiającą wykonywanie wywołań systemowych + (linux-vdso.so.1). + + +

+

+ Podczas konsolidacji nie podaje się pełnych ścieżek do bibliotek, aby + zachować elastyczność. Zazwyczaj dostępne będą jedynie nazwy. Za + odnalezienie bibliotek w systemie odpowiada właśnie + konsolidator dynamiczny - ld.so + (/lib64/ld-linux-x86-64.so.2). + Przyjrzmy się linii standardowej biblioteki języka C. To co znajduje + się po lewej stronie operatora (=>) + zostało odczytane z programu, natomiast to co znajduje się po + po prawej stronie operatora, jest wynikiem pracy właśnie + konsolidatora dynamicznego. +

+

Odnajdywanie przez ld.so bibliotek współużytkowanych

+

+ Program ld.so posiada wewnątrz wstępnie skonfigurowaną + ścieżkę wyszukiwania bibliotek. Do utworzenia tej + wykorzystywana jest tzw. składnica systemowa - w pliku + /etc/ld.so.cache. Zawiera ona informacje o bibliotekach + współdzielonych i ich lokalizacji. Przyczym aby uwzględnić taką + lokalizację należy podać ścieżkę do katalogu z bibliotekami w pliku + konfiguracjnym składnicy - /etc/ld.so.conf lub w plikach + wewnątrz katalogu /etc/ld.so.conf.d. Zawartość tego pliku + zazwyczaj składa się ze ścieżek wskazujących na katalogi jakie należy + dodać do składnicy. Poniżej znajduje się jeden z plików w katalogu + /etc/ld.so.conf.d, zawierający listę ścieżek +

+
+xf0r3m@vm-2339495:~/C$ cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf
+# Multiarch support
+/usr/local/lib/x86_64-linux-gnu
+/lib/x86_64-linux-gnu
+/usr/lib/x86_64-linux-gnu
+
+

+ Standardowe lokalizacje takie /usr/lib czy /lib, są domyślne i nie + ma potrzeby ich dodawania do składnicy. Każda zmiana w pliku + konfiguracyjnym wymaga przebudowania pliku samej składnicy, + a dokonać tego możemy za pomocą poniższego polecenia: +

+
+xf0r3m@vm-2339495:~/C$ sudo ldconfig -v
+[sudo] hasło użytkownika xf0r3m:
+ldconfig: Nie można wykonać stat na /usr/local/lib/x86_64-linux-gnu: Nie ma takiego pliku ani katalogu
+ldconfig: Ścieżka `/usr/lib/x86_64-linux-gnu' podana więcej niż raz
+(od /etc/ld.so.conf.d/x86_64-linux-gnu.conf:4 i /etc/ld.so.conf.d/x86_64-linux-gnu.conf:3)
+ldconfig: Ścieżka `/lib/x86_64-linux-gnu' podana więcej niż raz
+(od :0 i /etc/ld.so.conf.d/x86_64-linux-gnu.conf:3)
+ldconfig: Ścieżka `/usr/lib/x86_64-linux-gnu' podana więcej niż raz
+(od :0 i /etc/ld.so.conf.d/x86_64-linux-gnu.conf:3)
+ldconfig: Ścieżka `/usr/lib' podana więcej niż raz
+(od :0 i :0)
+/usr/lib/x86_64-linux-gnu/libfakeroot: (od /etc/ld.so.conf.d/fakeroot-x86_64-linux-gnu.conf:1)
+        libfakeroot-0.so -> libfakeroot-tcp.so
+/usr/local/lib: (od /etc/ld.so.conf.d/libc.conf:2)
+/lib/x86_64-linux-gnu: (od /etc/ld.so.conf.d/x86_64-linux-gnu.conf:3)
+        libzxcvbn.so.0 -> libzxcvbn.so.0.0.0
+        libzvbi.so.0 -> libzvbi.so.0.13.2
+        libzvbi-chains.so.0 -> libzvbi-chains.so.0.0.0
+        libzstd.so.1 -> libzstd.so.1.5.5
+        libzmq.so.5 -> libzmq.so.5.2.5
+        libzmf-0.0.so.0 -> libzmf-0.0.so.0.0.2
+        libzix-0.so.0 -> libzix-0.so.0.4.2
+        libzimg.so.2 -> libzimg.so.2.0.0
+        libzbar.so.0 -> libzbar.so.0.3.0
+        libz3.so.4 -> libz3.so.4
+
+

+ Opcja -v powoduje wyświetlenie + bardziej szczegółowych komunikatów. +

+

+ Program ld.so może wykorzystać wykorzystać jescze jedno + miejsce w celu znalezienia informacji na temat gdzie mogą znajdować + się biblioteki - zmienne LD_LIBRARY_PATH. Nie + we wszystkich systemach jest ona zdefiniowana i może zostać + wykorzystana do wskazania niestandardowych bibliotek tuż przed + uruchomieniem programu. +

+

+ Nie ma co za bardzo skupiać się na dodawaniu ścieżek do składnicy. + Wprowadzone przez nas zmiany mogą doprowadzić do chaosu w systemie + i powodować konflikty. Jeśli już musimy uzyć jakiejś niestandardowej + biblioteki to należy już podczas kompilacji zadeklarować ją oraz + jej lokalizację (w podrozdziale poniżej, pokazano jak to zrobić). +

+

Konsolidacja programów z bibliotekami współużytkowanymi

2024; COPYLEFT; ALL RIGHTS REVERSED;