co to jest biblioteka w Linuksie?
dlaczego korzystamy z bibliotek?
jak stworzyć statyczną i dynamiczną bibliotekę?
jak i dlaczego ich używamy?
Biblioteka w Linuksie
Biblioteka jest zbiorem wstępnie skompilowanych fragmentów kodu zwanych funkcjami. Biblioteka zawiera wspólne funkcje i razem tworzą pakiet o nazwie-biblioteka. Funkcje są blokami kodu, które są ponownie wykorzystywane w całym programie. Ponowne użycie fragmentów kodu w programie oszczędza czas. Zapobiega to kilkukrotnemu przepisywaniu kodu przez programistę. Dla programistów biblioteki zapewniają funkcje wielokrotnego użytku, struktury danych, klasy i tak dalej.
„na przykład, jeśli tworzysz aplikację, która musi wykonywać operacje matematyczne, nie musisz tworzyć nowej funkcji matematycznej, możesz po prostu użyć istniejących funkcji w bibliotekach dla tego języka programowania.”(„Zrozumienie bibliotek współdzielonych w Linuksie”)
biblioteka nie jest wykonywalna i jest to zasadnicza różnica w stosunku do procesów i aplikacji. Biblioteki odgrywają swoją rolę w czasie uruchamiania lub kompilacji. W języku programowania C mamy dwa typy bibliotek: biblioteki dynamiczne i biblioteki statyczne.
biblioteki mają pliki obiektowe utworzone przez "-c" gcc flag
i kończą się na ".o"
zgodnie z konwencją. Są one wynikiem wyjścia kompilatora i zawierają definicje funkcji w postaci binarnej.
różnice między bibliotekami dynamicznymi i statycznymi
biblioteki dynamiczne lub współdzielone występują jako oddzielne pliki poza plikami wykonywalnymi. W związku z tym potrzebuje tylko jednej kopii plików biblioteki w czasie wykonywania. W czasie kompilacji biblioteki statyczne pozostają zablokowane w programie. Zawiera on programy plików posiadających kopię plików biblioteki w czasie kompilacji.
podczas korzystania z biblioteki dynamicznej programista odwołuje się do niej, gdy jest to konieczne w czasie wykonywania. Na przykład, aby uzyskać dostęp do funkcji długości łańcucha z standard input/output header file
— można uzyskać do niej dostęp dynamiczny. Znajdzie odniesienie do biblioteki programu w czasie wykonywania ze względu na dynamiczny loader. Następnie ładuje tę funkcję długości łańcucha do pamięci. W związku z tym dynamiczna dostępność biblioteki musi być łatwo dostępna lub staje się bezsilna.
zalety i wady bibliotek dynamicznych
- potrzebuje tylko jednej kopii w czasie wykonywania. Jest to zależne od tego, czy aplikacja i biblioteka są blisko dostępne dla siebie.
- wiele uruchomionych aplikacji korzysta z tej samej biblioteki bez konieczności posiadania własnej kopii KAŻDEGO pliku.
- co jednak, jeśli biblioteka dynamiczna zostanie uszkodzona? Plik wykonywalny może nie działać, ponieważ żyje poza plikiem wykonywalnym i jest podatny na złamanie.
- przechowują mniejsze pliki.
- biblioteki dynamiczne są łączone w czasie działania. Nie wymaga rekompilacji i ponownego łączenia, gdy programista dokona zmiany.
w czasie kompilacji aplikacje wykorzystują biblioteki statyczne. Wszystkie kopie funkcji są umieszczane w pliku aplikacji, ponieważ są one potrzebne do uruchomienia procesu.
zalety i wady bibliotek statycznych
- biblioteki statyczne są odporne na luki, ponieważ żyją wewnątrz pliku wykonywalnego.
- szybkość w czasie wykonywania występuje szybciej, ponieważ jego kod obiektowy (binarny) znajduje się w pliku wykonywalnym. W ten sposób wywołania funkcji są wykonywane szybciej. Pamiętaj, że biblioteka dynamiczna żyje poza plikiem wykonywalnym, więc wywołania będą wykonywane z zewnątrz pliku wykonywalnego.
- zmiany wprowadzone w plikach i programie wymagają ponownego podłączenia i rekompilacji.
- Rozmiar pliku jest znacznie większy.
Jak stworzyć statyczną i dynamiczną bibliotekę?
w przypadku obu bibliotek program powinien zawierać prototype
dla każdej z funkcji istniejących w bibliotece. Jeśli używasz pliku nagłówkowego, nie zapomnij dołączyć header filename
.
#include "<header file name>"
biblioteki dynamiczne
aby utworzyć bibliotekę dynamiczną, napisz następujące polecenie:
gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so
z "*.c"
– pobiera wszystkie pliki źródłowe C w bieżącym katalogu i tworzy współdzieloną bibliotekę o nazwie "liball.so."
flaga -fPIC
pozwala na odwołanie się do następującego kodu pod dowolnym wirtualnym adresem w czasie wykonywania. Oznacza kod niezależny od pozycji.Biblioteka nie przechowuje danych pod ustalonymi adresami, ponieważ jej położenie w pamięci zmienia się pomiędzy programami. Pliki obiektowe są kompilowane za pomocą -shared flag
. compiler
później zidentyfikuje bibliotekę, wyszukując pliki zaczynające się od "lib"
i kończące się konwencją nazewnictwa, .so
program potrzebuje ścieżki, aby wyszukać pliki biblioteki. Aby dodać tę lokalizację do zmiennej środowiskowej o nazwie LD_LIBRARY_PATH.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
podczas korzystania z biblioteki dynamicznej wpisz następujące polecenie:
gcc -g -wall -o app app.c liball.so
Biblioteki statyczne
aby utworzyć bibliotekę statyczną, musimy użyć następującego polecenia:
ar rc liball.a dog.o cat.o bird.o
"ar"
oznaczaarchive
i służy do tworzenia biblioteki statycznej. Wszystkie pliki kończące się na".o"
zostaną dodane doliball.a library
i są to w tym przypadku pliki obiektowe.
-rc flag
zrobi dwie rzeczy: zastąpi i utworzy nową bibliotekę, jeśli jeszcze nie istnieje. Następnym krokiem jest indeksowanie, aby to zrobić, wpisujemy:
ranlib liball.a
podczas korzystania z biblioteki statycznej wpisz następujące polecenie:
gcc main.c -L -l<filename>
-L flag
uzyskuje dostęp do linker
, więc biblioteki można znaleźć w podanym katalogu. Wyszukuje również inne lokalizacje, w których kompilator szuka bibliotek systemowych.