From: xf0r3m
+ 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Å: +
++ 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.
+
+ 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Ä). +
+2024; COPYLEFT; ALL RIGHTS REVERSED;