Wstęp
Notatki z tworzenia bibliotek dzielonych i statycznych.
Prawie całkowicie na podstawie książki : "Linux Programowanie w przykładach - Kurt Wall" .
Programy:
nm - wypisuje symbole znajdujące się w pliku
ar - tworzy, modyfikuje lub rozpakowuje archiwa. (Najczęściej do bibliotek statycznych).
ldd - wypisuje biblioteki dzielone których potrzebuje program do prawidłowego działania
ldconfig - określa łącza w czasie działania (run-time Linka) / znajduje biblioteki w systemie. ( z poleceniem "-p" wypisuje co Trzema ls.so w buforze). | zmienna systemowa $LD_PRELOAD to lista oddzielonych spacjami bibliotek ładowanych przed wszystkimi innymi. (Użyteczne gdy mamy w systemie jedna bibliotekę a dla programu chcemy użyć innej).
Tworzenie biblioteki statycznej:
- tworzymy nagłówek bs.h i implementacje bs.c
- tworzymy plik obiektowy: gcc -c bs.c -o bs.o
- tworzymy archiwum z nim: ar rcs bs.a bs.o
Użycie:
- Tworzymy program prog.c co korzysta z tej biblioteki (plik nagłówkowy bs.h
- Kompilujemy program
- Dodajemy do ścieżki katalog z archiwum z bibliotekę bs.a dla naszych celów jest to obecny "." za pomocą : -L.
- Dodajemy bibliotekę statyczną za pomocą : -lbs
- W efekcie kompilujemy +/- taką komendą: gcc prog.c -o prog.bin -L. -lbs
Tworzenie biblioteki dzielone:
Przy tworzeniu bibliotek dzielonych trzeba pamiętać o kilku rzeczach:
NIE UŻYWAĆ : Używanie opcji -fomit-frame-pointer uniemożliwi debugowanie
UŻYWAĆ:
- -fPIC tworzy kod niezależny od położenia (potrzebne gdyż biblioteka dzielona może zostać załadowana i dowiązana pod dowolnym adresem w przestrzeni adresowej aplikacji)
- -shared dla kompilatora żeby skompilował bibliotekę jako dzieloną
- -Wl,option przekazuje option do linkera jako opcje. Dzieli option względem przecinków "," (więc można wiele opcji podać na raz za pomocą przecinków).
- -soname liblibraryname.so opcję ustawić dla linkera mówiącą mu jak się ma nazywać biblioteka dzielona. Jest to ważne bo biblioteka dzielona sl w wersji 6 będzie się nazywać : libsl.so podczas gdy plik się będzie nazywać libsl.so.6.0.0
Wiec do roboty:
- Tworzymy plik z programem "prog.c" korzystający z biblioteki…
…
koniec konców użyłem komned:
gcc -fPIC -shared -Wl,-soname,libcommunication.so communication.c -o libcommunication.so
g++ example_of_use_in_cpp.cpp -o example_of_use_in_cpp.bin -L. -lcommunication
gcc example_of_use_in_c.c -o example_of_use_in_c.bin -L. -lcommunication
LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
./example_of_use_in_c.bin
./example_of_use_in_cpp.bin