]> gitweb.morketsmerke.org Git - mmdev.git/commitdiff
Kontynuacja tworzenia 14 rozdziału. Podrozdział 14.1.3 - Konsolidacja programów z...
authorxf0r3m <jakubstasinski@protonmaill.com>
Tue, 23 Apr 2024 15:14:06 +0000 (17:14 +0200)
committerxf0r3m <jakubstasinski@protonmaill.com>
Tue, 23 Apr 2024 15:14:06 +0000 (17:14 +0200)
articles/terminallog/Linux.Podstawy.html

index 436ff24a3055dc427efeb010bab9124170afd4b3..cc298e5dd63fc1fd88581db5d3dd0efaeb2a57c1 100644 (file)
@@ -11518,6 +11518,186 @@ $ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
           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 =&gt; /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">=&gt;</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 -&gt; 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 -&gt; libzxcvbn.so.0.0.0
+        libzvbi.so.0 -&gt; libzvbi.so.0.13.2
+        libzvbi-chains.so.0 -&gt; libzvbi-chains.so.0.0.0
+        libzstd.so.1 -&gt; libzstd.so.1.5.5
+        libzmq.so.5 -&gt; libzmq.so.5.2.5
+        libzmf-0.0.so.0 -&gt; libzmf-0.0.so.0.0.2
+        libzix-0.so.0 -&gt; libzix-0.so.0.4.2
+        libzimg.so.2 -&gt; libzimg.so.2.0.0
+        libzbar.so.0 -&gt; libzbar.so.0.3.0
+        libz3.so.4 -&gt; 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;