podstawy Linuksa: Biblioteki statyczne vs. biblioteki dynamiczne

Erika Caoili

Obserwuj

gru 17, 2019 · 4 min czytać

Zdjęcie Edwin Andrade na Unsplash

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 mają”*. więc „konwencja nazewnictwa i biblioteki statyczne mają”*.a”.

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

  1. potrzebuje tylko jednej kopii w czasie wykonywania. Jest to zależne od tego, czy aplikacja i biblioteka są blisko dostępne dla siebie.
  2. wiele uruchomionych aplikacji korzysta z tej samej biblioteki bez konieczności posiadania własnej kopii KAŻDEGO pliku.
  3. 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.
  4. przechowują mniejsze pliki.
  5. 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

  1. biblioteki statyczne są odporne na luki, ponieważ żyją wewnątrz pliku wykonywalnego.
  2. 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.
  3. zmiany wprowadzone w plikach i programie wymagają ponownego podłączenia i rekompilacji.
  4. 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" oznacza archive i służy do tworzenia biblioteki statycznej. Wszystkie pliki kończące się na ".o" zostaną dodane do liball.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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.