wykluczymy.
</p>
<h3 id="14.1.3.sharedlibraries">14.1.3. Biblioteki współużytkowane</h3>
+ <p>
+ Jak wiemy konsolidator zawsze dodaje do programów standardową
+ bibliotekę języka C - <em>libc.a</em>. Ten plik jest
+ <strong>biblioteką statyczną</strong>. 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.
+ </p>
+ <p>
+ 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.
+ </p>
+ <p>
+ Rozwiązaniem wyżej wymienionych są obecnie stoswane
+ <strong>biblioteki współdzielone</strong>. 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.
+ </p>
+ <p>
+ 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.
+ </p>
+ <p>
+ 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ń:
+ </p>
+ <ul>
+ <li>Jakich bibliotek współużytkowanych potrzebuje nasz program i jak
+ to sprawdzić?</li>
+ <li>W jaki sposób wyszukiwane są tego typu biblioteki?</li>
+ <li>W jaki sposób należy dokonać konsolidacji z bibliotekami
+ współdzielonymi?</li>
+ <li>Jakie mogą wyniknąć problemy podczas używania tych bibliotek i
+ jak ich ominąć?</li>
+ </ul>
+ <h4>Wypisywanie zależności od bibliotek współużytkowanych</h4>
+ <p>
+ Omawiajac kwestię bibliotek wspominalśmy miejsce ich położenia w
+ systemie. We współczesnych dystrybucjach katalog <em>/lib</em> jest
+ dowiązaniem symbolicznym do <em>/usr/lib</em>. Nie uświadczymy
+ również zbyt wielu bibliotek statycznych. Większość znich to
+ do biblioteki współdzielone, których pliki mają rozszerzenie
+ <em>.so</em>. 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 <strong>ldd</strong>.
+ </p>
+<pre class="code-block">
+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)
+</pre>
+ <p>
+ Polecenie <code class="code-inline">ldd</code> 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
+ (<code class="code-inline">ld-linux-x86-64.so.2</code>,
+ opisany poniżej) oraz
+ bibliotekę ułatwiającą wykonywanie wywołań systemowych
+ (<code class="code-inline">linux-vdso.so.1</code>).
+ <!-- Źródło: https://man7.org/linux/man-pages/man7/vdso.7.html -->
+ <!-- Źródło: https://www.baeldung.com/linux/dynamic-linker -->
+ </p>
+ <p>
+ 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
+ <strong>konsolidator dynamiczny - ld.so</strong>
+ (<code class="code-inline">/lib64/ld-linux-x86-64.so.2</code>).
+ Przyjrzmy się linii standardowej biblioteki języka C. To co znajduje
+ się po lewej stronie operatora (<code class="code-inline">=></code>)
+ zostało odczytane z programu, natomiast to co znajduje się po
+ po prawej stronie operatora, jest wynikiem pracy właśnie
+ konsolidatora dynamicznego.
+ </p>
+ <h4>Odnajdywanie przez ld.so bibliotek współużytkowanych</h4>
+ <p>
+ Program <em>ld.so</em> posiada wewnątrz wstępnie skonfigurowaną
+ <strong>ścieżkę wyszukiwania bibliotek</strong>. Do utworzenia tej
+ wykorzystywana jest tzw. <em>składnica systemowa</em> - w pliku
+ <em>/etc/ld.so.cache</em>. 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 - <em>/etc/ld.so.conf</em> lub w plikach
+ wewnątrz katalogu <em>/etc/ld.so.conf.d</em>. 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
+ <em>/etc/ld.so.conf.d</em>, zawierający listę ścieżek
+ </p>
+<pre class="code-block">
+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
+</pre>
+ <p>
+ 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:
+ </p>
+<pre class="code-block">
+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 <builtin>: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 <builtin>:0 i /etc/ld.so.conf.d/x86_64-linux-gnu.conf:3)
+ldconfig: Ścieżka `/usr/lib' podana więcej niż raz
+(od <builtin>:0 i <builtin>: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
+</pre>
+ <p>
+ Opcja <code class="code-inline">-v</code> powoduje wyświetlenie
+ bardziej szczegółowych komunikatów.
+ </p>
+ <p>
+ Program <em>ld.so</em> może wykorzystać wykorzystać jescze jedno
+ miejsce w celu znalezienia informacji na temat gdzie mogą znajdować
+ się biblioteki - zmienne <strong>LD_LIBRARY_PATH</strong>. Nie
+ we wszystkich systemach jest ona zdefiniowana i może zostać
+ wykorzystana do wskazania niestandardowych bibliotek tuż przed
+ uruchomieniem programu.
+ </p>
+ <p>
+ 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ć).
+ </p>
+ <h4>Konsolidacja programów z bibliotekami współużytkowanymi</h4>
</div>
<p style="margin: 15px; padding: 0; outline: 0;">
2024; COPYLEFT; ALL RIGHTS REVERSED;